我一直在将if-elif链转换为结构模式匹配,但在反向测试中遇到了困难。
很容易生成与任何支持的模式(文本、类、映射、序列等)匹配的案例。我如何证明一个否定的匹配?
例如,当对象的类型不匹配时,我需要强制它:
if isinstance(x, (list, dict)):
x = json.dump(x)
elif not isinstance(x, str): # <-- Inverted test
x = str(x)
从本质上讲,结构模式匹配的设计仅在存在正匹配的情况下触发。然而,有两种解决方法。
最简单的方法是添加一个保护表达式。但这是最后的手段,因为它并没有利用模式匹配和分解功能。
第二种方法是添加早期匹配测试,以便稍后的案例可以假定反向匹配为真。如果负面案例是最后一个案例,那么这种方法效果很好。如果没有,则会变得有点尴尬,因为需要嵌套。
进行反向测试并将其移动到if表达式中:
match x:
case list() | dict():
x = json.dump(x)
case _ if not isinstance(x, str): # <-- Inverted test
x = str(x)
这里的基本思想是进行积极匹配,以便后续案例可以假设消极匹配:
match x:
case list() | dict():
x = json.dump(x)
case str(): # <-- Positive match
pass
case _: # <-- Inverted case
x = str(x)
除非您有其他要匹配的情况,否则预测试技术是优雅的:
if isinstance(x, (list, dict)):
x = json.dump(x)
elif not isinstance(x, str): # <-- Inverted test
x = str(x)
elif x == 'quit': # <-- Additional test
sys.exit(0)
这里最简单的解决方案是将附加测试移动到倒置测试之前:
match x:
case list() | dict():
x = json.dump(x)
case 'quit': # <-- Moved the test up
sys.exit(0)
case str(): # <-- Positive match
pass
case _: # <-- Inverted case
x = str(x)
并不总是可以重新安排测试顺序。如果是这样,则可以引入新级别的嵌套匹配:
case list() | dict():
x = json.dump(x)
case str(): # <-- Positive match
match x: # <-- Nested match
case 'quit': # <-- Inner case
sys.exit(0)
case _: # <-- Inverted case
x = str(x)
我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?
我有一个字符串,我正试图根据几个regex模式验证它,我希望由于模式匹配在3.10中可用,我可以使用它来代替创建if-else块。 考虑一个字符串'validateString',其可能的值1021102,1.25.32string021。 我尝试的代码如下所示。 对于正则表达式1、2和3,我尝试了字符串正则表达式模式,还重新设置了。编译对象,但它似乎不起作用。 我一直试图在互联网上找到这方面的例
字面量 变量 占位符
我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢
使用结构模式匹配,如何编写匹配哈希类型实例的案例? 我尝试过: 但是,这得到了错误的答案,因为每个类型都定义了它是否可哈希: