代码之家  ›  专栏  ›  技术社区  ›  retodaredevil

在python中是否应该在类型注释周围加引号

  •  28
  • retodaredevil  · 技术社区  · 7 年前

    这两个函数有什么不同?我看到人们在类型注释周围加引号,有时会把它们去掉,但我不明白为什么人们会选择使用其中一种。

    def do_something(entity: Entity):
        pass
    def do_something(entity: 'Entity'):
        pass
    

    2 回复  |  直到 7 年前
        1
  •  23
  •   Dimitris Fasarakis Hilliard    7 年前

    在创建类型提示时,在类型提示周围加引号是有意义的 Forward Reference 根据PEP 484。在这种情况下,在名称周围加引号用于抑制可能发生的名称错误。

    在其他情况下,不要使用引号,这不会产生您想要的提示:

    >>> def bad_foo(a: 'int'):
    ...     pass
    >>> def good_foo(a: int):
    ...     pass
    >>> bad_foo.__annotations__['a'] == good_foo.__annotations__['a']
    False
    

        2
  •  4
  •   Timmmm    2 年前

    显然,如果在某些情况下不引用它们,也可能导致运行时异常。看见 this comment . 我不知道为什么,但确实如此:

     ~ python3
    Python 3.9.2 (default, Mar 26 2021, 23:27:12)
    [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> def main() -> OrderedDict[str, str]:
    ...     x: OrderedDict[str, str] = OrderedDict()
    ...     print(x)
    ...     return x
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'OrderedDict' is not defined
    >>> def main() -> 'OrderedDict[str, str]':
    ...     x: OrderedDict[str, str] = OrderedDict()
    ...     print(x)
    ...     return x
    ...
    >>>
    

    from __future__ import annotations .