输入'其他'的提示在魔术方法?

时间:2015-06-17 18:01:34

标签: python type-hinting

class Interval(object):
    def __sub__(self, other: Interval):
        pass

我得到一个' NameError:name' Interval'未定义'。有人能告诉我哪种类型在这里是正确的吗?

1 个答案:

答案 0 :(得分:7)

在Python完成执行类块中的所有代码(包括方法定义)之前,该类不存在。

只需使用字符串文字,如PEP 484中所述:

class Interval(object):
    def __sub__(self, other: 'Interval'):
        pass

请注意,在内部类中引用一个方法非常好:

class Interval(object):
    def __sub__(self, other: 'Interval'):
        Interval.do_something()

如果您需要在方法签名中使用它或直接在类块中使用它,这只是一个问题。

从Python 3.7开始,上面的解决方法是no longer necessary (但仍然完全有效,因此如果您需要支持旧版本的Python,您可以并且应该继续使用它)。相反,将以下内容放在每个模块的顶部以启用该模块中的前向引用:

from __future__ import annotations

这将导致所有注释在查找时被延迟评估,以便您可以在其定义中引用类,甚至可以在它们的定义之前引用它们。简而言之,它使每一个'合理'"注释意味着你(可能)想要的意思。

最后,如果您需要检查类型注释,请确保使用typing.get_type_hints()而不是.__annotations__特殊属性。此函数正确处理旧的和新的处理方式,以及类型提示规则的一些其他细微差别,例如当默认值为Optional[T]时自动None。检查附加到任意Python对象的类型提示是一种舒适且面向未来的方法。