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



运行

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

给出

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

这有什么原因吗?

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

试图注释受global或相同功能范围内的nonlocal

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

原因是globalnonlocal不拥有变量;因此类型注释属于拥有该变量的范围。

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

因此,正如非常的旧语言功能经常发生的情况一样,这是令人困惑的。python中的global是一个声明名称与类似globals()字典的容器中的键匹配的语句。如果密钥在类似globals()字典的容器中还不是,则会添加它。此时它将默认为值None。如果在全局作用域中分配了变量(并在当时定义(,则变量的名称将添加到类似globals()字典的容器中,并且被设置为与类似globals()字典的容器的名称匹配的键的值。

因此,global关键字是一个向类似globals()字典的容器添加名称的语句。不幸的是,您不能在使用global将变量的名称添加到类似globals()字典的容器的同一行中对变量进行赋值。

由于这种悲伤,在类似globals()字典的容器中添加一个名称将使其成为Python打字世界中的可选类型。

我仍然认为这是一个精神上的错误。这并不明显。目前还不清楚。这真的不明智。然而,事实确实如此。

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

对公认答案的给定解释实际上毫无意义,而且在本次讨论中,annotating global variables似乎与should be allowed一样是共识:https://bugs.python.org/issue34939然而,到目前为止——Python 3.8——它还没有实现。

问题一定是在实现中,而不是在逻辑上。

相关内容

  • 没有找到相关文章

最新更新