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

在python中是否应该在类型注释周围加引号,python,python-3.x,type-hinting,static-typing,Python,Python 3.x,Type Hinting,Static Typing,这两种功能有什么区别?我见过有人在类型注释周围加引号,有时不加引号,但我不明白为什么人们会选择使用其中一种 def do_something(entity: Entity): pass def do_something(entity: 'Entity'): pass 这些方法有哪些优点或缺点?根据PEP 484,在类型提示周围加引号是有意义的。在本例中,在名称周围加引号用于抑制可能发生的名称错误 在其他情况下,不要使用引号,它不会产生您想要的提示: >>> d

这两种功能有什么区别?我见过有人在类型注释周围加引号,有时不加引号,但我不明白为什么人们会选择使用其中一种

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

这些方法有哪些优点或缺点?

根据PEP 484,在类型提示周围加引号是有意义的。在本例中,在名称周围加引号用于抑制可能发生的名称错误

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

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

虽然目前类型检查程序(mypy,至少)似乎并没有对这些进行不同的处理,但我不确定将来是否会出现这种情况。最好是清楚,不要在你实际上不需要的时候使用引号

显然,如果在某些情况下不引用运行时异常,它也会导致运行时异常。看见我不知道为什么,但肯定是这样的:

 ~ 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
...
>>>
~蟒蛇3
Python 3.9.2(默认值,2021年3月26日,23:27:12)
关于达尔文的[Clang 12.0.0(Clang-1200.0.32.29)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>def main()->OrderedDict[str,str]:
...     x:OrderedDict[str,str]=OrderedDict()
...     打印(x)
...     返回x
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“OrderedDict”
>>>def main()->“OrderedDict[str,str]”:
...     x:OrderedDict[str,str]=OrderedDict()
...     打印(x)
...     返回x
...
>>>

是一种通过转发引用解析类型提示的方法,如果需要的话。我认为Python邮件列表上有一些关于使类型注释的解析变慢的传言,以便您以后可以定义内容(在您的示例中,在所有代码下面定义
实体
)。