我有一张词典 list ,我想用python-attrs
来把它们转换成班级.
以下是示例数据:
[[characters]]
first_name = 'Duffy'
last_name = 'Duck'
[[characters]]
first_name = 'Bugs'
last_name = 'Bunny'
[[characters]]
first_name = 'Sylvester'
last_name = 'Pussycat'
[[characters]]
first_name = 'Elmar'
last_name = 'Fudd'
[[characters]]
first_name = 'Tweety'
last_name = 'Bird'
[[characters]]
first_name = 'Sam'
last_name = 'Yosemite'
[[characters]]
first_name = 'Wile E.'
last_name = 'Coyote'
[[characters]]
first_name = 'Road'
last_name = 'Runner'
在阅读完内容后,这将变成一本词典:
{'characters': [{'first_name': 'Duffy', 'last_name': 'Duck'},
{'first_name': 'Bugs', 'last_name': 'Bunny'},
{'first_name': 'Sylvester', 'last_name': 'Pussycat'},
{'first_name': 'Elmar', 'last_name': 'Fudd'},
{'first_name': 'Tweety', 'last_name': 'Bird'},
{'first_name': 'Sam', 'last_name': 'Yosemite'},
{'first_name': 'Wile E.', 'last_name': 'Coyote'},
{'first_name': 'Road', 'last_name': 'Runner'}]}
我的课程是这样的:
@define(kw_only=True)
class Character:
first_name: str
last_name: str
@define
class LooneyToons:
characters: List[Character] = field(factory=list, converter=Character)
但它不起作用:
TypeError: Character.__init__() takes 1 positional argument but 2 were given
当然,我可以稍微修改一下类,并使用下面的代码(它可以工作):
@define
class LooneyToons:
characters: List[Character]
> LooneyToons([Character(**x) for x in d['characters']])
LooneyToons(characters=[Character(first_name='Duffy', last_name='Duck'), Character(first_name='Bugs', last_name='Bunny'), Character(first_name='Sylvester', last_name='Pussycat'), Character(first_name='Elmar', last_name='Fudd'), Character(first_name='Tweety', last_name='Bird'), Character(first_name='Sam', last_name='Yosemite'), Character(first_name='Wile E.', last_name='Coyote'), Character(first_name='Road', last_name='Runner')])
但(在我看来)在LooneyToons
类中通过将d['characters']
作为参数提供给类来处理这一问题会更优雅.
对我有什么提示吗?我已经判断了cattrs
个,但我不明白它对我的情况可能有什么用处.