【问题标题】:Conditional statement inside a match case匹配案例中的条件语句
【发布时间】:2022-10-18 06:02:52
【问题描述】:

是否可以将条件语句作为 Python 中匹配语句的案例?

像这样工作:

test = 'Aston Martin'
makes = ['Aston Martin', 'Bentley']

match test:
    case if test in makes:
        print(True)
    case _:
        print(False)

我知道 match/case 不是在寻找具有布尔值 True 的东西,但似乎这对于缩放事物很有用。

我尝试将其作为一个函数来执行,以便您可以返回完全匹配:

test = 'Aston Martin'
makes = ['Aston Martin', 'Bentley']

def return_bool(item, lists):
    if item in lists:
        return item
    else:
        return 'notmatching'

match test:
    case return_bool(test, makes):
        print(True)
    case _:
        print(False)

这也没有奏效。我认为它需要一个格式输出,比如str(x)

【问题讨论】:

  • 匹配案例进行模式匹配,而不是表达式评估。你想要的只是一个普通的if
  • 我认为您正在尝试将结构模式匹配用于看起来更像 if、elif 和 else 的情况。
  • 与其根据类似陈述在其他语言中的工作方式进行猜测,不如阅读PEP,实际上描述这个怎么运作。
  • return_bool(test, makes) 是一个类模式,它将尝试将test 与名为return_bool 的类的实例进行匹配。它不是产生要匹配的布尔值的函数调用。

标签: python match case python-3.10


【解决方案1】:

正如 cmets 所指出的,您提供的代码似乎更适合 if/elif然而它可以完成,因为match 支持所谓的“保护条款”。

test = 'Aston Martin'
makes = ['Aston Martin', 'Bentley']

match test:
    case test if test in makes:
        print(True)
    case _:
        print(False)

即使在makes 不是固定序列的情况下,这也有效。如果makes 真的只是固定序列的替代品,那么您也可以使用

test = 'Aston Martin'

match test:
    case 'Aston Martin' | 'Bentley':
        print(True)
    case _:
        print(False)

请注意,您不能做这个

test = 'Aston Martin'
makes = ['Aston Martin', 'Bentley']

match test:
    case makes:
        print(True)
    case _:
        print(False)

因为这将始终匹配第一种情况,用test 覆盖makes

【讨论】:

  • 第二个不测试test 是否是给定列表的元素。它试图检查test包含这两个元素的列表。
  • 能够,但是,使用case "Aston Martin" | "Bentley": 来检查一组硬编码的模式。
  • 我知道case "blah" | "bla": 是可能的,我只设置了这么短的列表作为示例。我开始考虑这个问题,因为这就是我最初的想法,但我意识到我正在为大量不同的选项匹配相同的案例,导致我在一个案例中拥有大量 |。这让我觉得一定有更好的方法。
  • 我想只使用 if, elif 是要走的路。感觉就像是有一个可能的答案。我会去阅读文档,看看有什么可能。
【解决方案2】:

改用:if elif
阅读以了解比赛:PEP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2021-12-23
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多