在魔术方法中输入 'other' 的提示?
Type hint for 'other' in magic methods?
class Interval(object):
def __sub__(self, other: Interval):
pass
我得到的是“NameError: name 'Interval' is not defined”。有人可以告诉我哪种类型是正确的吗?
class 直到 Python 执行完 class 块内的所有代码(包括您的方法定义)后才存在。
按照 PEP 484:
中的建议,只需使用字符串文字即可
class Interval(object):
def __sub__(self, other: 'Interval'):
pass
注意参考class里面一个方法就完全没问题了:
class Interval(object):
def __sub__(self, other: 'Interval'):
Interval.do_something()
仅当您需要在方法签名中或直接在 class 块内使用它时才会出现问题。
从 Python 3.7 开始,上述解决方法是 no longer necessary(但仍然完全有效,因此如果需要,您可以而且应该继续使用它以支持 Python 的旧版本)。相反,将以下内容放在每个模块的顶部以启用该模块内的前向引用:
from __future__ import annotations
这将导致在查找时延迟评估所有注释,因此您可以在它们的定义中甚至在它们的定义之前引用 classes。简而言之,它使每个 "reasonable" 注释都代表您(可能)希望它表达的意思。
最后,如果您需要检查类型注释,请确保您使用的是 typing.get_type_hints()
而不是 .__annotations__
特殊属性。这个函数正确地处理了旧的和新的做事方式,以及类型提示规则的一些其他细微差别,例如当默认值为 None
时自动 Optional[T]
。这是检查附加到任意 Python 对象的类型提示的舒适且面向未来的方法。
class Interval(object):
def __sub__(self, other: Interval):
pass
我得到的是“NameError: name 'Interval' is not defined”。有人可以告诉我哪种类型是正确的吗?
class 直到 Python 执行完 class 块内的所有代码(包括您的方法定义)后才存在。
按照 PEP 484:
中的建议,只需使用字符串文字即可class Interval(object):
def __sub__(self, other: 'Interval'):
pass
注意参考class里面一个方法就完全没问题了:
class Interval(object):
def __sub__(self, other: 'Interval'):
Interval.do_something()
仅当您需要在方法签名中或直接在 class 块内使用它时才会出现问题。
从 Python 3.7 开始,上述解决方法是 no longer necessary(但仍然完全有效,因此如果需要,您可以而且应该继续使用它以支持 Python 的旧版本)。相反,将以下内容放在每个模块的顶部以启用该模块内的前向引用:
from __future__ import annotations
这将导致在查找时延迟评估所有注释,因此您可以在它们的定义中甚至在它们的定义之前引用 classes。简而言之,它使每个 "reasonable" 注释都代表您(可能)希望它表达的意思。
最后,如果您需要检查类型注释,请确保您使用的是 typing.get_type_hints()
而不是 .__annotations__
特殊属性。这个函数正确地处理了旧的和新的做事方式,以及类型提示规则的一些其他细微差别,例如当默认值为 None
时自动 Optional[T]
。这是检查附加到任意 Python 对象的类型提示的舒适且面向未来的方法。