【发布时间】:2010-11-05 09:41:34
【问题描述】:
我正在尝试将数据从简单的对象图转换为字典。我不需要类型信息或方法,也不需要能够再次将其转换回对象。
我找到了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
这似乎工作得更好,不需要例外,但我仍然不确定这里是否有我不知道它落在哪里的案例。
任何建议将不胜感激。
【问题讨论】:
-
在python中使用异常并不是那么糟糕,有时它可以简化编码,这是一种pythonic方式-EAFP(Easier to Ask Forgiveness than Permission)
-
特殊情况可能是当对象有 slots,已编辑答案
-
点了,但例外的事情有点像一场圣战,我倾向于永远不要抛出它们,除非有什么真正的例外,而不是预期的程序流程。每个人都有自己的那个:)
-
是的,主要是风格,但有时异常可以真正简单地编码,例如当内部大多数功能通过异常进行通信时,有时它可以加快速度,例如如果在这种情况下 99.99% 的对象有 dict,而不是检查 99.99% 的时间,检查异常 0.01% 的时间
标签: python python-2.6