Rego 对象理解对我来说似乎难以理解;小写按键

问题描述 投票:0回答:1

在 rego 中,我想转换这个:

d := {"a": "aye", "B": "bEe"}

至:

l := {"a": "aye", "b": "bEe"}

其中键全部小写,但值不是。如何在一个作业行或多个作业行(如果需要)中完成此操作?我希望以下其中一种能够起作用,但它们不起作用,我尝试过的无数排列也不起作用。

d := {"a": "aye", "B": "bEe"}
l1 := { k: lower(v) | k = d[_]; v = d[k] }
l2 := { k: lower(v) | k = d[_], v = d[k] }
l3 := { k : lower(v) |
  k = d[_]
  v = d[k]
}

在Python中这可能是:

l = {k.lower(): v for k, v in d.items()}

如何在 rego 中实现同样的功能?


更多尝试(无效)如下:

l4 := {k: v | k := lower(k), v := v}
l5 := {k: v | k := lower k, v := d[k]}
l6 := {k: v | k := lower(d[k]), v := d[k]}
dictionary-comprehension open-policy-agent rego
1个回答
0
投票

在 Rego 中,您可以通过对象理解来完成此操作,如下所示,其中理解将构建一个

key: value
“字典”,通过迭代对象并设置值,然后将键设置为每个键的小写值来实现迭代:

policy.rego

package example

d := {"a": "aye", "B": "bEe"}
l := { lowered_key: val | val := d[key]; lowered_key := lower(key) }

运行此命令:

opa eval -d policy.rego "data.example"

{
  "result": [
    {
      "expressions": [
        {
          "value": {
            "d": {
              "B": "bEe",
              "a": "aye"
            },
            "l": {
              "a": "aye",
              "b": "bEe"
            }
          },
          "text": "data.example",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ]
    }
  ]
}

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.