从 class 属性 输入提示

type hint from a class property

我有一个用例,我想在基 class 中定义一个通用函数,但在子 [=] 中从覆盖的 属性 注释 return 类型21=]。这是一个愚蠢的例子,但清楚地展示了我想做什么:

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 的 return 值,以便常规的旧 IDE 能够在执行操作时检测到 return 类型应该是什么StrCls().cast_to_return_type(some_var)(在 pycharm 和 vscode 上试过,都不知道该怎么做任何决定 Any 是 return 类型,如果它不能推断 Any 是有道理的 child class 值)

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

一样

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

subclasses IntClsStrCls 通过在它们是 subclassing 的类型之后包括方括号内的类型来“赋值”到类型变量.

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