【问题标题】:type hint from a class property来自类属性的类型提示
【发布时间】:2021-12-14 00:17:36
【问题描述】:

我有一个用例,我想在基类中定义一个通用函数,但要从子类中的重写属性注释返回类型。这是一个愚蠢的例子,但清楚地表明了我想做的事情:

from typing import Any

class BaseCls:
    RETURNS_TYPE: Any = NotImplemented

    # This is what I am not sure how to do, this does not work
    # Have tried a few different things, but hoping someone just knows
    def cast_to_return_type(self: 'BaseCls', value: Any) -> 'BaseCls.RETURNS_TYPE':
        return some_work_that_returns_self_RETURNS_TYPE()

class IntCls(BaseCls):
    RETURNS_TYPE = int

class StrCls(BaseCls):
    RETURNS_TYPE = str

如何键入提示 cast_to_return_type 的返回值,以便常规旧 IDE 在执行 StrCls().cast_to_return_type(some_var) 时能够检测到返回类型应该是什么(在 pycharm 和 vscode 上尝试过,都不知道该怎么做决定Any 是返回类型,如果它不能推断出子类的值,这是有道理的)

【问题讨论】:

标签: python type-hinting python-typing


【解决方案1】:

typing 与变量类型最接近的是typing.TypeVar。它们的用途是创建一个泛型类,就像您编写 list[int]Mapping[str, str] 一样。

所以我们可以重写您的代码,使BaseCls 是一个泛型类型,带有一个类型变量ReturnsType。 (您应该只对常量使用全部大写。)

IntClsStrCls 子类通过在它们子类化的类型后面包含方括号内的类型“分配”给类型变量。

from typing import TypeVar, Generic, Any

ReturnsType = TypeVar('ReturnsType')

class BaseCls(Generic[ReturnsType]):
    def cast_to_return_type(self, value: Any) -> ReturnsType:
        return some_work_that_returns_self_RETURNS_TYPE()

class IntCls(BaseCls[int]):
    pass

class StrCls(BaseCls[str]):
    pass

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 2019-02-20
    • 2013-11-22
    • 2019-03-26
    • 2016-09-12
    相关资源
    最近更新 更多