我得到了一个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"
      }, ...]

我想做一些可以匹配id的事情,而不必列出一长串的|个.

比如:

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'])

它是Python的一个相对较新的补充,因此关于如何使用它的指南还不多.

推荐答案

你可以使用100:

for event in data:
    match event:
        case {'id': x} if x.startswith("matchme"): # guard
            print(event["message"])
        case {'id':'anotherid'}:
            print(event["message"])

引用official documentation年前的话,

100

我们可以在模式中添加一个if子句,称为"guard".If the guard is 101, match goes on to try the next 102 block.注意

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

另见:

Python-3.x相关问答推荐

从日志(log)文件中查找延迟最低的用户

使用 pandas 进行多类分类的总体准确度

如何在 django 中没有循环的情况下获得前键的前键?

运行 pip install -r requirements.txt 时出错

如何查找 tensorflow.python.data.ops.dataset_ops.MapDataset 对象的大小或形状,make_csv_dataset 的输出

将名字转换成姓氏、首字母和中间字母的格式

聚合(aggregate)为最多包含两个元素的列表

使用一周的特定第一天将每日日期转换为每周

IronPython 3 支持?

pip search 和 pip install 出错

matplotlib - 模块“sip”没有属性“setapi”

Python 3.x 中的 NoneType 在哪里?

NumPy ndarray dtype 的类型提示?

从 __future__ 导入注释

try 注释散列变量时,“ABCMeta”对象不可下标

Python 类成员类型提示

Pytorch 的随机选择?

TypeError:无法实例化类型元组;使用 tuple() 代替

简单的 get/post 请求在 python 3 中被阻止,但在 python 2 中没有

带有kwargs的函数的python类型签名(typing.Callable)