在 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]}
在 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
}
}
]
}
]
}
参考资料: