gpt4 book ai didi

python - 当 value 是 cls 的实例时,您可以注释返回类型吗?

转载 作者:行者123 更新时间:2023-12-02 03:36:48 25 4
gpt4 key购买 nike

给定一个带有初始化辅助方法的类:

class TrivialClass:
def __init__(self, str_arg: str):
self.string_attribute = str_arg

@classmethod
def from_int(cls, int_arg: int) -> ?:
str_arg = str(int_arg)
return cls(str_arg)

是否可以注释from_int方法的返回类型?

我尝试了 clsTrivialClass,但 PyCharm 将它们标记为未解析的引用,这在当时听起来很合理。

最佳答案

从 Python 3.11 开始,您可以使用新的 typing.Self object 。对于较旧的 Python 版本,您可以使用 typing-extensions project 获取相同的对象。 :

try:
from typing import Self
except ImportError:
from typing_extensions import Self


class TrivialClass:
# ...

@classmethod
def from_int(cls, int_arg: int) -> Self:
# ...
return cls(...)

请注意,在这种情况下,您不需要注释 cls

警告:mypy 对 Self 类型的支持尚未发布;您需要等待0.991之后的下一个版本。 Pyright 已经支持它。

如果您迫不及待地想要 Mypy 支持,那么您可以使用泛型类型来指示您将返回 cls 的实例:

from typing import Type, TypeVar

T = TypeVar('T', bound='TrivialClass')

class TrivialClass:
# ...

@classmethod
def from_int(cls: Type[T], int_arg: int) -> T:
# ...
return cls(...)

任何重写类方法但随后返回父类实例(TrivialClass 或仍然是祖先的子类)的子类都会被检测为错误,因为工厂方法被定义为返回 cls 类型的实例。

bound 参数指定 T 必须是 TrivialClass(的子类);因为在定义泛型时该类还不存在,所以需要使用 forward reference (带有名称的字符串)。

请参阅Annotating instance and class methods section PEP 484。

<小时/>

注意:此答案的第一次修订提倡使用前向引用将类本身命名为返回值,但是 issue 1212使得使用泛型成为可能,这是一个更好的解决方案。

从 Python 3.7 开始,当您使用 from __future__ import annotations 启动模块时,您可以避免在注释中使用前向引用。 ,但在模块级别创建 TypeVar() 对象不是注释。即使在 Python 3.10 中也是如此,它推迟了注释中的所有类型提示解析。

关于python - 当 value 是 cls 的实例时,您可以注释返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com