3

由于PEP 526 -- 变量注释的语法被批准,在 Python 3.6+ 中,可以在表单中提供类型提示信息,x: intPEP 也说“但是,注释局部变量将导致解释器始终使其成为本地变量范围并使变量未初始化”。因此,在 Python 3.6+ 中,这样写在语法上是合法的:

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部分,这个问题非常接近:

  1. 何时检查非局部变量的存在?
  2. 访问在封闭范围中定义的变量

从这个角度来看,它是可以关闭的。事实上,我们无法达成共识,如果我们选择在我们的代码库中使用这种形式,我想听听您对可能存在的陷阱的看法。

4

0 回答 0