跑步
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
原因是
和global
不拥有变量;所以, 类型注释属于拥有该变量的范围。nonlocal
解决方案是在函数外部注释变量(即在全局命名空间中),并删除函数作用域内的类型注释。
因此,正如非常“古老的语言功能”经常出现的情况一样,这很令人困惑。
python 中的 global
是一个声明name 来匹配
globals()
类字典容器中的键的语句。
如果密钥不是 globals()
类似字典的容器中的 已经,则会添加它。此时它将默认为 None 值。
如果在全局范围内分配变量(并在当时定义),则该变量的 name 将添加到 globals()
类似字典的容器中,并且 value 将设置为与 globals()
类似字典的容器中的 name 匹配的键。因此, global 关键字是一个向 globals()
类似字典的容器添加名称的语句。
不幸的是,您无法在使用
globals()
类似字典的容器中时对变量进行赋值。由于这种悲伤,向 globals()
类似字典的容器添加名称将隐式使其成为 Python 打字世界中的可选类型。
我仍然认为这是心理上的一个错误。这并不明显。不清楚。这确实不太明智。然而,它就在那里。正确的做法是能够在全局化的同时立即为全局赋值,从而拥有非可选的全局类型,并消除不明显、令人困惑的麻烦边缘情况这是。打字很棒,如果能在 Python 中拥有更多打字功能就太好了。它有助于扩展,有助于消除导致困难错误的逻辑错误和歧义。当您没有考虑变量可能是与编写的代码完全不兼容的类型时,它会突出显示。