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

2024-09-28 18:46:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

   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


Tags: 代码ifpayloadtemperaturecsqpowersourcescriptsversionreboottimes
2条回答

直接生成一个dict,然后过滤以忽略falsy值可能是最安全/最直接的解决方案:

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)

类似地,对于已经存在payload的“构建一个dict然后过滤它”情况,只需构建并过滤一个单独的dictadditional_payload或类似内容),然后生成最后一行:

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}

相关问题 更多 >