使用变量类型注释作为非本地范围内的占位符?

时间:2017-12-20 18:46:41

标签: python scope annotations python-3.6 python-nonlocal

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

  1. When existence of nonlocal variables is checked?
  2. Accessing variables defined in enclosing scope
  3. 从这个角度来看,它可以被关闭。事实上,我们无法达成共识,如果我们选择在代码库中使用此表单,我想听听您对可能存在的陷阱的想法。

0 个答案:

没有答案