Python 如何缩短这段非常冗余的代码

Python 如何缩短这段非常冗余的代码,python,Python,有没有可能把这段代码缩短到只有几行 if rulesVersion: payload["rulesVersion"] = rulesVersion if scriptsVersion: payload["scriptsVersion"] = scriptsVersion if csq: payload["CSQ"] = csq if rebootTimes: payload["RebootTimes"]

有没有可能把这段代码缩短到只有几行

   if rulesVersion:
        payload["rulesVersion"] = rulesVersion
    if scriptsVersion:
        payload["scriptsVersion"] = scriptsVersion
    if csq:
        payload["CSQ"] = csq
    if rebootTimes:
        payload["RebootTimes"] = rebootTimes
    if acdcSwitch:
        payload["PowerSource"] = acdcSwitch
    if temperature:
        payload["Temperature"] = temperature


直接编写
dict
,然后过滤以忽略错误值可能是最安全/最直接的解决方案:

payload = {"rulesVersion": rulesVersion,
           "scriptsVersion": scriptsVersion,
           "CSQ": csq,
           "RebootTimes": rebootTimes,
           "PowerSource": acdcSwitch,
           "Temperature": temperature}
payload = {k: v for k, v in payload.items() if v}  # Filter out falsy entries
另一种方法(如果不小心,可能会出现名称和值不匹配的风险)是将内容进行元组化,并在简单的
dict
理解中循环
zip
-ed对:

names = ("rulesVersion", "scriptsVersion", "CSQ", "RebootTimes", "PowerSource", "Temperature")
values = (rulesVersion, scriptsVersion, csq, rebootTimes, acdcSwitch, temperature)

payload = {name: val for name, val in zip(names, values) if val}
如果
payload
是一个已经存在的非空
dict
,您可以将最后一行更改为如下内容,以添加新值,而不是将
payload
重新绑定到一个全新的
dict

payload.update({name: val for name, val in zip(names, values) if val})
# Or genexpr for lower memory overhead, but slightly slower/uglier:
# payload.update((name, val) for name, val in zip(names, values) if val)
类似地,对于“构建一个
dict
然后过滤它”的情况,其中
有效载荷
已经存在,只需构建并过滤一个单独的
dict
额外的_有效载荷
或类似的内容),然后做最后一行:

payload.update(additional_payload)

我喜欢这个问题。我不会像关心代码的可读性那样关心行数。以下是我将如何处理这个问题:

# testing
rulesVersion, scriptsVersion, csq, rebootTimes, acdcSwitch, temperature = 1.0, 1.0, 1, "Test", "Test", 42
payload = {}

### BEGIN CODE BODY

data = {
    "rulesVersion": rulesVersion,
    "scriptsVersion": scriptsVersion,
    "CSQ": csq,
    "RebootTimes": rebootTimes,
    "PowerSource": acdcSwitch,
    "Temperature": temperature
}

for key in data:
    val = data[key]
    if(val): payload[key] = val

### END CODE BODY

# testing
print(payload)

此测试输出
{'rulesVersion':1.0,'scriptsVersion':1.0,'CSQ':1,'RebootTimes':'test','PowerSource','test','Temperature':42}

答案实际上取决于您的通用代码体系结构。想多分享一点吗?在这个不完整的代码片段中,没有;或者至少不应该缩短,因为每个
if
引用不同的变量。您必须重新构造程序,以便
规则版本
脚本版本
csq
等都是集合数据类型的一部分,如
dict
列表
请不要破坏帖子。我认为最好首先将名称/值写在字典中,否则,很难检查名称和值是否正确匹配(例如,
temperature
垂直显示在
“PowerSource”
下方,而不是
“temperature”
)。您仍然可以进行dict理解,以便在之后筛选truthy值。ShadowRanger k和v代表的有效负载是什么={k:v代表k,v在有效负载中。items()如果v}#过滤掉falsyentries@AlexHernandez:
k
v
是迭代任意
dict
键和
值的传统单字母占位符。如果适用,请使用更好的名称。