自PEP 526 -- Syntax for Variable Annotations获得批准后,在Python 3.6+中,可以以 x: int
的形式提供类型提示信息,PEP也会说“但是,注释局部变量将导致解释器始终使其成为范围的本地,并使变量保持未初始化“。因此,在Python 3.6+中,编写语法 legal :
def outer():
x: int
def inner():
nonlocal x
x = 10
inner()
print(x)
虽然上述代码段在语义上更等同于:
def outer():
#x
def inner():
nonlocal x
x = 10
inner()
print(x)
这显然是 SyntaxError: no binding for nonlocal 'x' found
,对双关语抱歉。在PEP 8和Python 3.6文档中也没有任何关于这种风格的说法。
我应该将此视为错误,实施细节(副作用),疣或功能吗?
在网上搜索了一些后,我发现这个效果已经在stdlib中使用了 - typing.NamedTuple
但实际上类的主体不是作用域,而且这种效果似乎也在Python中被利用了3.7 @dataclasses
。这种情况让我感到惊讶,事实证明,如果没有 type annotations
,有些事情是无法完成的,而他们的唯一目的是提供没有任何运行时或编译时效果的类型提示。
相对 nonlocal
部分,这个问题非常接近:
从这个角度来看,它可以被关闭。事实上,我们无法达成共识,如果我们选择在代码库中使用此表单,我想听听您对可能存在的陷阱的想法。