来自类属性的类型提示



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

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是返回类型,这是有意义的,如果它不能推断子类值)

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

所以我们可以重写你的代码,使BaseCls是一个泛型类型,与类型变量ReturnsType。(常量只能用大写)

子类IntClsStrCls"assign"在要子类化的类型后面加上方括号内的类型。

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

最新更新