gpt4 book ai didi

python - 递归地将python对象图转换为字典

转载 作者:IT老高 更新时间:2023-10-28 22:02:34 24 4
gpt4 key购买 nike

我正在尝试将数据从简单的对象图转换为字典。我不需要类型信息或方法,也不需要能够再次将其转换回对象。

我找到了 this question about creating a dictionary from an object's fields ,但它不会递归执行。

对 python 来说相对较新,我担心我的解决方案可能很丑陋,或者 unpythonic,或者以某种晦涩的方式损坏,或者只是普通的旧 NIH。

我的第一次尝试似乎有效,直到我尝试使用列表和字典,并且检查传递的对象是否具有内部字典似乎更容易,如果没有,则将其视为一个值(而不是全部那是实例检查)。我之前的尝试也没有递归到对象列表中:

def todict(obj):
if hasattr(obj, "__iter__"):
return [todict(v) for v in obj]
elif hasattr(obj, "__dict__"):
return dict([(key, todict(value))
for key, value in obj.__dict__.iteritems()
if not callable(value) and not key.startswith('_')])
else:
return obj

这似乎效果更好,不需要异常(exception),但我仍然不确定这里是否有案例,我不知道它落在哪里。

任何建议将不胜感激。

最佳答案

我自己的尝试和从 Anurag Uniyal 和 Lennart Regebro 的答案中获得的线索的融合最适合我:

def todict(obj, classkey=None):
if isinstance(obj, dict):
data = {}
for (k, v) in obj.items():
data[k] = todict(v, classkey)
return data
elif hasattr(obj, "_ast"):
return todict(obj._ast())
elif hasattr(obj, "__iter__") and not isinstance(obj, str):
return [todict(v, classkey) for v in obj]
elif hasattr(obj, "__dict__"):
data = dict([(key, todict(value, classkey))
for key, value in obj.__dict__.items()
if not callable(value) and not key.startswith('_')])
if classkey is not None and hasattr(obj, "__class__"):
data[classkey] = obj.__class__.__name__
return data
else:
return obj

关于python - 递归地将python对象图转换为字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com