【问题标题】:Return type based on type argument基于类型参数的返回类型
【发布时间】:2021-11-10 00:55:51
【问题描述】:

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

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)

我明白了

返回值类型不兼容(得到“Tuple[BaseObject, ...]”,预期为“Tuple[DerivedObject, ...]”)mypy(error)

我可以解决这个问题

import typing

def use_it(df: pd.DataFrame) -> Tuple[DerivedObject,...]:
    return typing.cast(Tuple[DerivedObject,...], df2objects(df, DerivedObject))

但我真正想做的是指定 df2objects 返回一个 object_type 元组,如下所示:

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

当然,这些都不起作用。

【问题讨论】:

标签: python type-hinting python-typing


【解决方案1】:

正如在 cmets 中提到的那样,我相信使用 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 T 的可能类型限制为DerivedObject 及其子类。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2022-11-04
    • 2020-10-27
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多