繁体   English   中英

来自类属性的类型提示

[英]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的泛型类型。 (您应该只对常量使用全部大写。)

子类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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM