为什么带注释的变量不能是全局的?

问题描述 投票:0回答:3

跑步

def function():
    global global_values
    global_values: str = []

给予

SyntaxError: annotated name 'global_values' can't be global

这有什么原因吗?

python-3.x syntax-error global-variables
3个回答
14
投票

这已在 PEP-526 中进行了解释:

尝试注释受

global
nonlocal
在相同的功能范围内:

def f():
    global x: int  # SyntaxError

def g():
    x: int  # Also a SyntaxError
    global x

原因是

global
nonlocal
不拥有变量;所以, 类型注释属于拥有该变量的范围。

解决方案是在函数外部注释变量(即在全局命名空间中),并删除函数作用域内的类型注释。


8
投票

因此,正如非常“古老的语言功能”经常出现的情况一样,这很令人困惑。 python 中的 global

 是一个声明 
name 来匹配 globals() 类字典容器中的键的语句。 如果密钥不是
globals()
类似字典的容器中的 已经,则会添加它。此时它将默认为 None 值。 如果在全局范围内分配变量(并在当时定义),则该变量的
name 将添加到 globals() 类似字典的容器中,并且 
value 将设置为与 globals() 类似字典的容器中的 name 匹配的键。
因此, 

global 关键字是一个向 globals() 类似字典的容器添加名称的语句。 不幸的是,您无法在使用

global 将该变量的名称添加到 globals() 类似字典的容器中时对变量进行赋值。
由于这种悲伤,向 

globals()

类似字典的容器添加名称将隐式使其成为 Python 打字世界中的可选类型。

我仍然认为这是心理上的一个错误。这并不明显。不清楚。这确实不太明智。然而,它就在那里。

正确的做法是能够在全局化的同时立即为全局赋值,从而拥有非可选的全局类型,并消除不明显、令人困惑的麻烦边缘情况这是。打字很棒,如果能在 Python 中拥有更多打字功能就太好了。它有助于扩展,有助于消除导致困难错误的逻辑错误和歧义。当您没有考虑变量可能是与编写的代码完全不兼容的类型时,它会突出显示。


1
投票
annotating global variables

是本次讨论中

should be allowed
的共识:
https://bugs.python.org/issue34939
,但是到目前为止 - Python 3.8 - 尚未实现。 问题一定出在执行上,而不是逻辑上。

© www.soinside.com 2019 - 2024. All rights reserved.