从 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 IntCls
和 StrCls
通过在它们是 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
我有一个用例,我想在基 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 IntCls
和 StrCls
通过在它们是 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