字典字面量中是否有可能拥有“可选”键,而不是在if
语句中添加它们?
像这样:
a = True
b = False
c = True
d = False
obj = {
"do_a": "args for a" if a,
"do_b": "args for b" if b,
"do_c": "args for c" if c,
"do_d": "args for d" if d,
}
#expect:
obj == {
"do_a": "args for a",
"do_c": "args for c",
}
为了更好的理解,请允许我加入一些背景信息:
我知道如何处理逻辑 :) 我只是想避免使用if
语句,因为我的对象是一个大型的数据块,代表着声明式逻辑,所以移动东西就有点像"意大利面条式编码",而这并不是本来就应该是过程化的。
我希望对象的值看起来像是一个查询。
实际上,它是一个elasticsearch查询,所以它会像这样:
{
"query": {
"bool": {
"must": [
<FILTER A>,
<FILTER B>, # would like to make this filter optional
<FILTER C>,
{
"more nested stuff" : [ ... ]
}
],
"other options": [ ... ]
},
"other options": [ ... ]
},
"other options": [ ... ]
}
我的目标可能有些可疑,就是让它看起来像一个查询,你可以查看并理解其形状,而不必跟踪if
语句。
也就是说,没有"filters": [f for f in filters if f.enabled],
因为这样你就必须去寻找过滤器,而这里所有的过滤器都是可选常量。
zip
是你的好朋友。 - dawg<FILTER X>
设计成一种只在需要时才计算的生成器? - dawg