[英]type hint from a class property
我有一个用例,我想在基类中定义一个通用函数,但从子类中的重写属性注释返回类型。 这是一个愚蠢的例子,但清楚地表明了我想做的事情:
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
的泛型类型。 (您应该只对常量使用全部大写。)
子类IntCls
和StrCls
通过在它们子类化的类型之后包含方括号内的类型来“分配”给类型变量。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.