【问题标题】:Type hint for 'other' in magic methods?在魔术方法中输入“其他”的提示?
【发布时间】:2015-09-03 03:01:38
【问题描述】:
class Interval(object):
    def __sub__(self, other: Interval):
        pass

我得到一个'NameError:名称'Interval'未定义'的方式。谁能告诉我这里哪种类型是正确的?

【问题讨论】:

    标签: python type-hinting


    【解决方案1】:

    在 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__ 特殊属性。当默认值为None 时,此函数正确处理旧的和新的做事方式,以及类型提示规则的一些其他细微差别,例如自动Optional[T]。这是检查附加到任意 Python 对象的类型提示的舒适且面向未来的方法。

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 2023-03-14
      • 1970-01-01
      • 2021-01-02
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多