是否有一种方法来匹配Python≥3.10中的不等式?



Python 3.10中新的结构模式匹配特性是一个非常受欢迎的特性。有没有办法用这个表述来匹配不平等呢?原型的例子:

match a:
case < 42:
print('Less')
case == 42:
print('The answer')
case > 42:
print('Greater')

可以使用:

match a:
case _ if a < 42:
print('Less')
case _ if a == 42:
print('The answer')
case _ if a > 42:
print('Greater')

另一个选项,没有保护符,使用纯模式匹配:

match [a < 42, a == 42]:
case [True, False]:
print('Less')
case [_, True]:
print('The answer')
case [False, False]:
print('Greater')

在本例中,使用if-elif更简单,即使这意味着重复变量名。

if a < 42:
print('Less')
elif a == 42:
print('The answer')
elif a > 42:
print('Greater')

注:像Thomas Sollie的回答那样,使用枚举和比较函数可以很好地为程序添加更多的结构,但对于基本脚本之类的东西来说,这似乎是多余的。

说到代码风格,避免魔术数字:如果代码中的所有三个42表示相同的东西,请给它一个名称,例如:
the_answer = 42
if a < the_answer:
...

match-case语句本质上是为匹配等式而设计的(因此有了"match"这个词)。在您的原型示例中,您可以通过匹配if子句来实现这一点(正如其他答案所建议的那样),但是现在您实质上只是匹配True和False,这似乎是多余的。

其他语言解决这个问题的一种方法是通过使用枚举进行比较:
from enum import Enum

class Ordering(Enum):
LESS = 1
EQUAL = 2
GREATER = 3

def compare(a, b):
if a < b:
return Ordering.LESS
elif a == b:
return Ordering.EQUAL
elif a > b:
return Ordering.GREATER

match compare(a, 42):
case Ordering.LESS:
print("Less")
case Ordering.EQUAL:
print("The answer")
case Ordering.GREATER:
print("Greater")

相关内容

  • 没有找到相关文章

最新更新