Python 3.10 match 如何比较 1 和 True?

umi*_*itu 7 python pattern-matching python-3.x python-3.10

PEP 622,文字模式说明如下:

请注意,由于使用了等式 (__eq__),并且布尔值与整数 0 和 1 之间是等价的,因此以下两者之间没有实际差异:

case True:
    ...

case 1:
    ...
Run Code Online (Sandbox Code Playgroud)

True.__eq__(1)(1).__eq__(True)返回 True,但是当我用 CPython 运行这两个代码片段时,它看起来像case Truecase 1不一样。

$ python3.10
>>> match 1:
...     case True:
...         print('a')  # not executed
... 
>>> match True:
...     case 1:
...         print('a')  # executed
... 
a
Run Code Online (Sandbox Code Playgroud)

1和实际相比如何True

jua*_*aga 10

查看模式匹配规范,这属于“文字模式”

如果使用以下比较规则将主题值与文字表达的值进行比较,则文字模式成功:

  • 使用 == 运算符比较数字和字符串。
  • 使用 is 运算符比较单例文字 None、True 和 False。

所以当模式是:

 case True:
Run Code Online (Sandbox Code Playgroud)

它使用is, 且1 is True为 false。另一方面,

case 1:
Run Code Online (Sandbox Code Playgroud)

使用==,且1 == True为真。