Python 3.10 模式匹配 (PEP 634) - 字符串中的通配符

Mar*_*ter 28 python json pattern-matching python-3.x python-3.10

我有一个很大的 JSON 对象列表,我想根据其中一个键的开头来解析这些对象,并使用通配符来处理其余的。很多键都是相似的,例如"matchme-foo""matchme-bar"。有一个内置通配符,但它仅用于整个值,有点像else.

我可能忽略了一些东西,但我在提案中找不到解决方案:

https://docs.python.org/3/whatsnew/3.10.html#pep-634-structural-pattern-matching

PEP-636 中还有更多相关信息:

https://www.python.org/dev/peps/pep-0636/#going-to-the-cloud-mappings

我的数据如下所示:

data = [{
          "id"     : "matchme-foo",
          "message": "hallo this is a message",
      },{
          "id"     : "matchme-bar",
          "message": "goodbye",
      },{
          "id"     : "anotherid",
          "message": "completely diffrent event"
      }, ...]
Run Code Online (Sandbox Code Playgroud)

我想做一些可以匹配 id 的事情,而不必制作一长串|'s。

像这样的东西:

for event in data:
    match event:
        case {'id':'matchme-*'}: # Match all 'matchme-' no matter what comes next
            log.INFO(event['message'])
        case {'id':'anotherid'}:
            log.ERROR(event['message'])
Run Code Online (Sandbox Code Playgroud)

它是 Python 的一个相对较新的补充,因此目前还没有太多关于如何使用它的指南。

Abd*_*P M 37

你可以使用守卫

\n
\n \nfor event in data:\n    match event:\n        case {\'id\': x} if x.startswith("matchme"): # guard\n            print(event["message"])\n        case {\'id\':\'anotherid\'}:\n            print(event["message"])
Run Code Online (Sandbox Code Playgroud)\n

引用官方文档

\n
\n

警卫

\n

我们可以if向模式添加一个子句,称为 \xe2\x80\x9c保护\xe2\x80\x9d。如果\nguard 是false,则匹配继续尝试下一个case。请注意,\n值捕获发生在评估防护之前:

\n
match point:\n     case Point(x, y) if x == y:\n         print(f"The point is located on the diagonal Y=X at {x}.")\n     case Point(x, y):\n         print(f"Point is not on the diagonal.")\n
Run Code Online (Sandbox Code Playgroud)\n
\n

也可以看看:

\n\n