为了账号安全,请及时绑定邮箱和手机立即绑定

字典文字中是否可以有可选键?

字典文字中是否可以有可选键?

翻过高山走不出你 2021-04-01 10:11:55
是否可以在dict文字中包含“可选”键,而不是在if语句中添加它们?像这样:a = Trueb = Falsec = Trued = Falseobj = {    "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": [ ... ]}而我可能会怀疑的目标是使它看起来像一个查询,您可以查看它并了解它的形状,而不必通过ifs进行跟踪。即,没有“过滤器”:[f中的f为过滤器中的f,如果启用f。],因为然后您必须去寻找过滤器,无论如何,这些过滤器都是可选常数
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

正如其他答案所述,我认为答案是“否”,但这是我到目前为止获得的最接近的答案...


虽然它稍微有点在“ wtf”的“令人讨厌”的一面


a = True

b = False

c = True

d = False


obj = {

    **({"do_a": "args for a"} if a else {}),

    **({"do_b": "args for b"} if b else {}),

    **({"do_c": "args for c"} if c else {}),

    **({"do_d": "args for d"} if d else {}),

}


#expect:

assert(obj == {

        "do_a": "args for a",

        "do_c": "args for c",

    })

或者,如果您想在某些函数中添加可选性,请执行以下操作:


def maybe(dictionary, condition, default=None):

    return dictionary if condition else default or {}


obj = {

    **maybe({"do_a": "args for a"}, a),

    **maybe({"do_b": "args for b"}, b),

    **maybe({"do_c": "args for c"}, c),

    **maybe({"do_d": "args for d"}, d),

}

这种代码的问题在于条件离结果越来越远(可以想象,我们最终将大字典传递给中的第一个参数maybe)。


查看完整回答
反对 回复 2021-04-20
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号