结构模式匹配 Python - 匹配一个集合/Frozenset
Structural Pattern Matching Python - Matching a Set / Frozenset
我一直在研究 Python 3.10 中的结构模式匹配,但不知道如何让它匹配一个集合。例如我试过:
a = {1,2,3}
match a:
case set(1,2,3):
print('matched')
我试过了:
a = {1,2,3}
match a:
case set([1,2,3]):
print('matched')
以及:
a = {1,2,3}
match a:
case [1,2,3] if isinstance(a, set):
print('matched')
我猜有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么可以尝试的。任何帮助,将不胜感激!谢谢!
这并不是结构模式匹配的真正用途;您匹配的模式更多的是 value 而不是 structure。因此,我认为您会发现等效的 if
形式更具可读性:
if a == {1, 2, 3}:
print('matched')
话虽如此...
Python 3.10 没有对匹配集的句法支持;它只有用于序列和映射的专用“显示”语法。我想我们简要地考虑了这一点,但最终放弃了它,因为它不是很有用或不直观(而且很容易在以后的版本中添加)。
幸运的是,可以使用限定(或“点”)名称通过相等匹配 任何 值。如果您需要匹配一个集合作为更大模式或 match
块的一部分,这可能是最好的方法:
class Constants:
SET_123 = {1, 2, 3}
match a:
case Constants.SET_123:
print('matched')
如果您只想匹配集(而不是,例如,frozensets),它也可以与 class 模式结合使用:
match a:
case set(Constants.SET_123):
print('matched')
由于 match
构造不使用集合相等来比较集合,
您将需要使用守卫来明确执行此操作:
a = {1,2,3}
match a:
case _ if a == set([1,2,3]):
print('matched')
默认情况下不将集合与集合相等进行比较是不直观的。
我一直在研究 Python 3.10 中的结构模式匹配,但不知道如何让它匹配一个集合。例如我试过:
a = {1,2,3}
match a:
case set(1,2,3):
print('matched')
我试过了:
a = {1,2,3}
match a:
case set([1,2,3]):
print('matched')
以及:
a = {1,2,3}
match a:
case [1,2,3] if isinstance(a, set):
print('matched')
我猜有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么可以尝试的。任何帮助,将不胜感激!谢谢!
这并不是结构模式匹配的真正用途;您匹配的模式更多的是 value 而不是 structure。因此,我认为您会发现等效的 if
形式更具可读性:
if a == {1, 2, 3}:
print('matched')
话虽如此...
Python 3.10 没有对匹配集的句法支持;它只有用于序列和映射的专用“显示”语法。我想我们简要地考虑了这一点,但最终放弃了它,因为它不是很有用或不直观(而且很容易在以后的版本中添加)。
幸运的是,可以使用限定(或“点”)名称通过相等匹配 任何 值。如果您需要匹配一个集合作为更大模式或 match
块的一部分,这可能是最好的方法:
class Constants:
SET_123 = {1, 2, 3}
match a:
case Constants.SET_123:
print('matched')
如果您只想匹配集(而不是,例如,frozensets),它也可以与 class 模式结合使用:
match a:
case set(Constants.SET_123):
print('matched')
由于 match
构造不使用集合相等来比较集合,
您将需要使用守卫来明确执行此操作:
a = {1,2,3}
match a:
case _ if a == set([1,2,3]):
print('matched')
默认情况下不将集合与集合相等进行比较是不直观的。