如何以更Pythonic的方式在Cisco APIC租户类的字典中添加值?
简化Cisco APIC Tenant类的字典初始化代码
当然有更Pythonic的写法!我们可以通过减少冗余拼接、合并重复逻辑来让代码更简洁,同时保持可读性。下面分几种场景给出优化方案:
场景1:不需要单独访问dn和rn实例变量
如果你的后续代码不需要单独调用self.dn或self.rn,完全可以直接在payload的字典里生成这些值,省去单独定义实例变量的步骤:
class Tenant: def __init__(self, apic, tenant_name, descr): self.apic = apic self.tenant_name = tenant_name self.descr = descr self.payload = { "fvTenant": { "attributes": { "descr": descr, "dn": f'uni/tn-{tenant_name}', "name": tenant_name, "rn": f'tn-{tenant_name}' } } }
这里用Python的f-string直接拼接字符串,而且直接使用方法参数descr和tenant_name,不用额外通过self.调用,代码更紧凑。
场景2:需要保留dn和rn实例变量
如果后续逻辑需要用到这两个变量,我们可以用赋值解包来一行生成它们,避免重复拼接tenant_name:
class Tenant: def __init__(self, apic, tenant_name, descr): self.apic = apic self.tenant_name = tenant_name self.descr = descr # 一行生成rn和dn,避免重复拼接 self.rn = f'tn-{tenant_name}' self.dn = f'uni/{self.rn}' self.payload = { "fvTenant": { "attributes": { "descr": descr, "dn": self.dn, "name": tenant_name, "rn": self.rn } } }
如果用Python 3.8+,还可以用赋值表达式进一步压缩成一行:
self.rn, self.dn = f'tn-{tenant_name}', f'uni/{self.rn}'
场景3:追求极致DRY(避免重复代码)
如果tn-{tenant_name}这个字符串在其他地方也会用到,我们可以把它存为临时变量,彻底消除重复:
class Tenant: def __init__(self, apic, tenant_name, descr): self.apic = apic self.tenant_name = tenant_name self.descr = descr tn_identifier = f'tn-{tenant_name}' self.dn = f'uni/{tn_identifier}' self.rn = tn_identifier self.payload = { "fvTenant": { "attributes": { "descr": descr, "dn": self.dn, "name": tenant_name, "rn": self.rn } } }
这些方案都比原来的代码更简洁,同时符合Python的简洁性原则,可读性也更强。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

