如何将嵌套字典转为Python对象并递归打印所有子键值对
嵌套字典转可递归展示的对象实现
需求:将嵌套字典转换为可通过属性访问的对象,且打印对象时能递归展示所有层级的键值对,而非仅显示内存地址。
输入示例字典:
user_vars = { "verbose": True, "testing": False, "login": { "username": "theadmin", "password": "password123" }, "interfaces": { "trust": { "ip": "10.8.10.1/30" }, "untrust": { "ip": "10.9.10.1/30" } } }
解决方案代码
通过实现payloadGen类,递归将嵌套字典转换为对象,并通过自定义__repr__方法实现递归打印:
class payloadGen: def __init__(self, data): for key, value in data.items(): if isinstance(value, dict): # 递归处理嵌套字典,转为payloadGen实例 setattr(self, key, payloadGen(value)) else: setattr(self, key, value) def __repr__(self): # 递归生成键值对的字符串表示 attrs = [] for key, value in self.__dict__.items(): attrs.append(f"{key}={repr(value)}") return f"payloadGen({', '.join(attrs)})"
用法演示
# 将字典转为对象 config = payloadGen(user_vars) # 通过属性访问嵌套值 print(config.login.username) # 输出: theadmin print(config.interfaces.trust.ip) # 输出: 10.8.10.1/30 # 打印整个对象,递归展示所有键值对 print(config)
打印config的输出效果:
payloadGen(verbose=True, testing=False, login=payloadGen(username='theadmin', password='password123'), interfaces=payloadGen(trust=payloadGen(ip='10.8.10.1/30'), untrust=payloadGen(ip='10.9.10.1/30')))
关键说明
__init__方法:遍历输入字典的键值对,若值为字典则递归创建payloadGen实例,实现嵌套结构的属性化访问。__repr__方法:遍历对象的所有属性,递归调用子属性的__repr__方法,最终拼接出完整的递归式字符串表示,解决了默认打印仅显示内存地址的问题。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

