我有这样一个代码,它的类型可以自行检查:
import pandas as pd
from typing import Tuple, Type
def df2objects(df: pd.DataFrame, object_type: Type[BaseObject]) -> Tuple[BaseObject, ...]:
return tuple(object_type(**kwargs) for kwargs in df.to_dict(orient='records')
但如果我尝试使用它:
def use_it(df: pd.DataFrame) -> Tuple[DerivedObject,...]:
return df2objects(df, DerivedObject)
我明白了
Incompatible return value type (got "Tuple[BaseObject, ...]", expected "Tuple[DerivedObject, ...]")mypy(error)
我可以用它来解决这个问题
import typing
def use_it(df: pd.DataFrame) -> Tuple[DerivedObject,...]:
return typing.cast(Tuple[DerivedObject,...], df2objects(df, DerivedObject))
但我真正想做的是指定DF2OObjects返回object_类型的元组,如下所示:
def df2objects(df: pd.DataFrame, object_type: Type[BaseObject]) -> Tuple[object_type, ...]:
或者这个:
def df2objects(df: pd.DataFrame, object_type: Type[BaseObject]) -> Tuple[BaseObject, ...]:
return typing.cast(Tuple[object_type,...],tuple(object_type(**kwargs) for kwargs in df.to_dict(orient='records'))
当然,这两种方法都不起作用
正如在评论中提到的,我认为使用
TypeVar
是这里的解决方案。假设DerivedObject
是BaseObject
的一个子类,则以下操作应该有效:通过使用}可能的类型限制为
bound
关键字参数,我们将TypeVar
{DerivedObject
及其子类关于泛型函数的mypy文档可以在here找到,关于
TypeVar
的文档可以在here找到,关于绑定的TypeVar
的信息可以在here找到相关问题 更多 >
编程相关推荐