你应该在python

时间:2017-09-27 23:01:17

标签: python python-3.x type-hinting static-typing

这两个功能有什么区别?我看到人们在类型注释周围加上引号,有时则将它们排除在外但我无法找到为什么人们会选择使用其中一种。

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

这些都有优点或缺点吗?

2 个答案:

答案 0 :(得分:0)

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

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

render()

虽然目前类型的跳棋(mypy,atleast)似乎没有区别对待这些,但我不确定将来是否会出现这种情况。当你实际上不需要时,最好清楚并且不要使用引号。

答案 1 :(得分:0)

显然,如果在某些情况下不引用它们,它也会导致运行时异常。见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
...
>>>