我有一张词典 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个,但我不明白它对我的情况可能有什么用处.

推荐答案

我是Cattrs的作者(也是attrs的维护者;).

问题是你对LooneyToons.charactersconverter个论点.以下是没有它的解决方案:

from typing import List

from attrs import define, field

from cattrs import structure

d = {
    "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)


structure(d, LooneyToons)

如果你坚持使用转换器,它必须比Character更复杂一些(见其他答案).但我建议直接把它go 掉.

Python相关问答推荐

正在设置字段.需要为假,因为错误列表索引必须是整数或切片,而不是字符串

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

使用Python从HTTP打印值

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

根据多列和一些条件创建新列

Django序列化器没有验证或保存数据

将numpy数组与空数组相加

如何在BeautifulSoup中链接Find()方法并处理无?

Pandas 第二小值有条件

对某些列的总数进行民意调查,但不单独列出每列

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

如何获取TFIDF Transformer中的值?

用Python解密Java加密文件

将pandas Dataframe转换为3D numpy矩阵

将9个3x3矩阵按特定顺序排列成9x9矩阵

如何让这个星型模式在Python中只使用一个for循环?

给定高度约束的旋转角解析求解

Python Pandas获取层次路径直到顶层管理

matplotlib + python foor loop

Polars将相同的自定义函数应用于组中的多个列,