我的目标是以递归方式将类转换为dict。我知道我需要指定与转换相关的规则,但我觉得内置python有一些方法可以递归类并生成一个dict。请参阅以下代码:
class Foo:
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
def __iter__(self):
yield 'a', self.a
yield 'b', self.b
yield 'c', self.c
class Bar:
def __init__(self, foos):
self.foos = foos
self.d = 5
def __iter__(self):
yield 'foos', self.foos
yield 'd', self.d
foos = [Foo(), Foo(), Foo()]
bar = Bar(foos)
print(dict(bar))
结果是:
{'foos': [<__main__.Foo object at 0x108e6be48>, <__main__.Foo object at 0x108e6bef0>, <__main__.Foo object at 0x108e6bf28>], 'd': 5}
foos
是Foo()
的列表,我希望看到扩展的词典列表。我知道我可以将以下内容添加到Foo
类中以使其工作:
def __repr__(self):
return repr(dict(self))
获得所需输出的结果:
{'foos': [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}], 'd': 5}
但这种做法看起来很苛刻 - 就像在,我强迫它把自己表现为一个字典,而不是自然可迭代(感觉就像我试图把一个方形钉挂在圆孔里)。
我对python世界的问题是:什么是接近这个的正确方法,以便我可以在我的类上调用dict()并获得完整的字典?
我已经四处寻找,似乎找不到任何特定于此主题的内容,所以我将在这里问一下。如果已经存在,请指出正确的方向。提前感谢您的帮助!
答案 0 :(得分:0)
我提出了两个可以满足你需求的黑客。
第一:通过替换此行在foos
变量中公开dicts:
foos = [Foo(), Foo(), Foo()]
这种黑客使用list comprehension
:
foos =[dict(k) for k in [Foo(), Foo(), Foo()]]
或者,就像这样:
foos = [dict(Foo()), dict(Foo()), dict(Foo())]
然后:
print(dict(bar))
>>> {'d': 5, 'foos': [{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]}
第二:通过替换此行在Bar.__iter__()
内公开词组:
yield 'foos', self.foos
由:
yield [dict(k) for k in self.foos]
然后:
print(dict(bar))
>>> {'d': 5, 'foos': [{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]}
奖励(不完全符合您的要求):通过替换此行使用dict comprehension
:
print(dict(bar))
由:
print({k:v if isinstance(v, int) else [dict(j) for j in v] for k,v in dict(bar).items()})
将打印:
>>> {'d': 5, 'foos': [{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]}