基于类型参数的返回类型

2024-09-27 09:33:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个代码,它的类型可以自行检查:

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'))

当然,这两种方法都不起作用


Tags: importtypingdataframedfreturnobjectdeftype
1条回答
网友
1楼 · 发布于 2024-09-27 09:33:18

正如在评论中提到的,我认为使用TypeVar是这里的解决方案。假设DerivedObjectBaseObject的一个子类,则以下操作应该有效:

import pandas as pd
from typing import Type, TypeVar, Tuple

T = TypeVar('T', bound=BaseObject)

def df2objects(df: pd.DataFrame, object_type: Type[T]) -> Tuple[T, ...]:
    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)

通过使用bound关键字参数,我们将TypeVar{}可能的类型限制为DerivedObject及其子类

关于泛型函数的mypy文档可以在here找到,关于TypeVar的文档可以在here找到,关于绑定的TypeVar的信息可以在here找到

相关问题 更多 >

    热门问题