a_g*_*est 102 python python-3.9
根据keyword
模块的文档,Python 3.9 中添加了两个新成员:
issoftkeyword
softkwlist
然而,他们的文档并未透露任何有关其目的的信息。新功能文章中甚至没有提到此更改,通常所有 API 更改都记录在文档中。深入挖掘源代码最终会导致这个拉取请求,其中提到“这本质上是一个内部工具”和“软关键字仍未使用”。那么 Python 的 soft 关键字的目的是什么?
cou*_*uka 66
简短:软关键字仍然可以用作变量或参数名称。
PEP 622 说明了一些问题(重点是我的):
硬关键字和软关键字的区别在于硬关键字始终是保留字,即使在它们没有意义的位置(例如 x = class + 1),而软关键字仅在上下文中具有特殊含义。
[...] match 和 case 关键字被建议为软关键字,以便它们分别在 match 语句或 case 块的开头被识别为关键字,但允许在其他地方用作变量或参数名称.
ruo*_*ola 34
我认为最好通过演示来解释这一点。async
andawait
是 Python 3.5 和 3.6 中的软关键字,因此它们可以用作标识符:
>>> async = "spam"
>>> async def foo():
... pass
...
>>> await = "bar"
>>> async, await
('spam', 'bar')
Run Code Online (Sandbox Code Playgroud)
但是在 Python 3.7 中,它们变成了正确的关键字,并且只能在有意义的特定上下文中使用:
>>> async = "123"
File "<stdin>", line 1
async = "123"
^
SyntaxError: invalid syntax
>>> async def foo():
... pass
...
>>> await = "bar"
File "<stdin>", line 1
await = "bar"
^
SyntaxError: invalid syntax
>>> async, await
File "<stdin>", line 1
async, await
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
首先将它们作为软关键字引入的想法主要是为了不破坏任何使用它们作为标识符的现有代码。同样的推理是即将到来的match
关键字,它会完全破坏例如re.match
和数百万个项目。
Mat*_*ndh 21
软关键字是上下文敏感的关键字。例如,class
只要它不能被解释为定义类,它就允许您用作变量名。它会允许使用,以取代cls
用class
的例子。
今天这是不可能的,因为class
是一个关键字:
>>> def a(class):
File "<stdin>", line 1
def a(class):
^
Run Code Online (Sandbox Code Playgroud)
鉴于上下文,很明显用户不打算定义一个新类,而是想要一个名为 的标识符class
。