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
时键和值的传统单字母占位符。如果适用,请使用更好的名称。