简述:软关键字仍可用作变量或参数名。
PEP 622给出了解释(重点标识自己):
硬关键字和软关键字的区别在于,硬关键字总是保留字,即使在它们不起作用的位置(例如,x = class + 1),而软关键字只有在上下文中才具有特殊含义。
提议将match和case关键字设置为软关键字,以便它们在匹配语句或case块开头被识别为关键字,但允许在其他地方用作变量或参数名。
match
和case
),但没有提供软关键字的一般解释。PEP 622提供了这个解释。 - coukaTrue
和False
根本不是关键字:它们只是内置作用域中的标识符。 as
和None
都不是有效的标识符名称。 (至少,我认为as
从一开始就是import
语句的一部分,因此它是一个关键字。如果它曾经是一个有效的标识符,那么它是在Python 1.5之前的某个时候。) - chepnerNone
明确会引发 SyntaxWarning
警告信息,而在 Python 2.5 及之前版本中,将变量赋值为 as
同样也会出现警告信息。 - gerrit我认为最好用演示来解释。在Python 3.5和3.6中,async
和await
是软关键字,因此它们可以被用作标识符:
>>> async = "spam"
>>> async def foo():
... pass
...
>>> await = "bar"
>>> async, await
('spam', 'bar')
但在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
最初将它们作为软关键字引入的想法主要是为了不破坏现有使用它们作为标识符的代码。同样的理由也适用于即将到来的 match
关键字,否则会完全破坏例如 re.match
和数百万个项目。
async
和await
是软关键字(虽然它们没有包含在keyword
模块中)。我有印象是新的PEG解析器使软关键字成为可能,那么你知道他们在Python 3.6中如何实现async
和await
吗? - a_guest软关键字是上下文敏感的关键字。例如,只要它不能被解释为定义类,就可以将 class
用作变量名。例如,可以将 cls
替换为 class
。
今天这是不可能的,因为 class
是一个关键字:
>>> def a(class):
File "<stdin>", line 1
def a(class):
^
从上下文来看,很明显该用户并不是想要定义一个新类,而是想要一个名为 class
的标识符。