在非局部范围中将变量类型注释用作占位符?

2024-09-29 23:17:52 发布

您现在位置:Python中文网/ 问答频道 /正文

由于PEP 526 -- Syntax for Variable Annotations已被批准,在python3.6+中,可以以x: int的形式提供类型提示信息,同时PEP说“但是,注释局部变量将导致解释器始终使其成为作用域的局部变量,并使变量保持未初始化状态”。因此,在Python3.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)

很明显这是个双关语,抱歉。另外,pep8和python3.6文档中也没有提到这种风格。你知道吗

那么我应该把它看作一个bug,或者一个实现细节(副作用),或者一个缺点,或者一个特性吗?

在网上搜索了一些之后,我发现这个效果已经在stdlib中使用了-typing.NamedTuple,但实际上类主体不是作用域,而且这个效果似乎在python3.7中也得到了利用。这种情况真的让我吃惊,事实证明,有些事情没有type annotations是做不到的,而它们的唯一目的是提供类型提示,而没有任何运行时或编译时效果。你知道吗

相对而言,这个问题非常接近:

  1. When existence of nonlocal variables is checked?
  2. Accessing variables defined in enclosing scope

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


Tags: 类型fordefvariables作用域形式pepint

热门问题