首页app攻略attrsct attrs

attrsct attrs

圆圆2025-08-06 00:00:42次浏览条评论

使用 attrs 和 cattrs 处理嵌套列表数据结构的最佳实践论文探讨了如何利用Python的attrs库优雅地处理包含了列表的复杂数据结构。针对将字典列表转换为attrs类实例列表的常见场景,文章阐述了直接使用转换器参数的局限性,并推荐使用cattrs库的结构函数。通过展示实例代码,教程了cattrs如何自动化原始字典数据解构并映射到attrs定义的类规范中,从而实现更简洁、健壮的数据转换。attrs简介与读写数据挑战

attrs是一个强大的python库,用于声明式地定义数据类,它通过装饰器@define简化了类的创建,并自动生成__init__,__repr__,__eq__等方法。这使得数据模型定义变得非常简洁和易读。

在实际应用中,我们经常会遇到需要处理查询数据结构的情况,例如一个主对象包含一个列表,而列表中的每个元素又是一个复杂的对象。当这些数据最初都是字典或 JSON 时 格式存在时,如何高效且优雅地将其转换为属性定义的类实例,特别是包含列表的场景,是一个常见的挑战。

考虑以下场景:我们有一组角色数据,每个角色包含first_name和last_name。这些角色被组织在一个名为字符的列表中,而整个结构是一个字典。

数据 = { quot;charactersquot;: [ {quot;first_namequot;:quot;Duffyquot;,quot;last_namequot;:quot;Duckquot;},{quot;first_namequot;:quot;Bugsquot;,quot;last_namequot;:quot;Bunnyquot;},{quot;first_namequot;:quot;Sylvesterquot;,quot;last_namequot;:quot;Pussycatquot;},{quot;first_namequot;:quot;Elmarquot;,quot;last_namequot;:quot;Fuddquot;},{quot;first_namequot;:quot;Tweetyquot;,quot;last_namequot;:quot;Birdquot;},{quot;first_namequot;:quot;Samquot;,quot;last_namequot;:quot;Yosemitequot;},{quot;first_namequot;: quot;Wile E.quot;, quot;last_namequot;: quot;Coyotequot;}, {quot;first_namequot;: quot;Roadquot;, quot;last_namequot;: quot;Runnerquot;}, ]}登录后复制

我们希望将其映射到以下 attrs 类结构中:from attrs import define,fieldfrom Typing import List@define(kw_only=True)class 字符: first_name:str last_name:str@defineclass LooneyToons:characters:List[Character]登录后复制

一个仔细但错误的尝试是为LooneyToons类中的characters字段使用转换器参数,并将其设置为Character类本身:#错误的结果,会导致TypeError@defineclass LooneyToons_In Correct:characters:List[Character] = field(factory=list, converter=Character)登录后复制

当尝试将 data['characters'](一个字典列表)提交给LooneyToons_In Correct时,会遇到TypeError:Character.__init__()takes 1positional argument but 2 were returned。这是因为转换器参数需要接收列表中的每个单独元素,把它的转换为Character实例。

然而,我们传递给 LooneyToons_In Correct 构造函数和整个字典列表,attrs 尝试将整个列表作为单个参数传递给 Character 的 __init__ 方法,这显然是不匹配的。cattrs:优雅的解决方案

为了解决数据转换的复杂性,cattrs 库应运而生。cattrs 是 attrs 的一个辅助库,专门用于 Python对象和各种数据格式(如字典、JSON)之间进行转换转换(结构化和非结构化)。它能够智能地处理复杂的字典结构,包括列表、字典和自定义 attrs 类。

使用 cattrs,我们可以非常简单地将上述数据字典转换为我们定义的 attrs 类实例。

from Typing Import List from Attrs Import Define, field from Cattrs Import Structure # 原始数据 data = { quot;charactersquot;: [ {quot;first_namequot;: quot;Duffyquot;, quot;last_namequot;: quot;Duckquot;}, {quot;first_namequot;: quot;Bugsquot;, quot;last_namequot;: quot;Bunnyquot;}, {quot;first_namequot;: quot;Sylvesterquot;, quot;last_namequot;: quot;Pussycatquot;}, {quot;first_namequot;: quot;Elmarquot;, quot;last_namequot;: quot;Fuddquot;}, {quot;first_namequot;: quot;Tweetyquot;, quot;last_namequot;: quot;Birdquot;}, {quot;first_namequot;: quot;Samquot;, quot;last_namequot;: quot;Yosemitequot;}, {quot;first_namequot;: quot;Wile E.quot;, quot;last_namequot;: quot;Coyotequot;}, {quot;first_namequot;: quot;Roadquot;, quot;last_namequot;: quot;Runnerquot;}, ]}# 定义字符类 @define(kw_only=True)class 字符: first_name: str last_name: str#定义 LooneyToons 类,字符 字段填充转换器@defineclass LooneyToons:字符:List[Character] = field(factory=list) #factory=list 确信默认值是一个空列表#使用cattrs.struct 进行转换looney_tunes_instance = Structure(data, LooneyToons)# 验证结果print(looney_tunes_instance)print(looney_tunes_instance.characters[0])print(isinstance(looney_tunes_instance.characters[0],Characters))登录后复制

输出示例:LooneyToons(characters=[Character(first_name='Duffy',last_name='Duck'), Character(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'),Character(first_name='Road',last_name='Runner')])Character(first_name='Duffy',last_name='Duck')True登录后复制

通过cattrs.struct(data, LooneyToons),cattrs会自动检测LooneyToons类中的字符字段类型为List[Character]。数据['字符'] 中的每一个字典,并智能熔化每个字典解构为字符类的一个实例。这种方式极大地简化了复杂数据结构的映射过程,避免了手动循环和构造实例。使用转换器时注意事项与转换汇总? attrs 字段的转换器参数适用于对单个索引值进行转换。例如,如果字符类中的first_name字段可以接收数字,则需要将其为字符串,那么可以在first_name字段上设置Converter=str。但对于将整个列表的字典转换为列表的 attrs 实例,转换器并不适用。cattrs 的强处:cattrs 扩充处理列表,它还能处理更复杂的解读结构,例如字典中的 attrs 类、以及自定义的转换规则。提供了一个灵活且可扩展的框架来处理数据序列化和反序列化。类型提示的重要性:在使用 attrs 和 cattrs 时,清晰的提示类型(如List[Character])至关重要。cattrs依赖这些类型信息来正确地进行数据格式化。安装cattrs:如果尚未安装cattrs,可以使用 pip install cattrs 命令进行安装。

总而言之,当处理涉及 attrs 类和读取列表(尤其是从字典数据转换而来)的复杂数据结构时,cattrs 库的结构函数是首选的解决方案。它提供了一种声明式、安全且高度自动化的类型来完成数据映射,使代码更加简洁、健壮和易于维护。

以上就是使用 attrs 和 cattrs处理请求列表数据结构的最佳实践的详细内容,更多请关注乐哥常识网其他相关文章!

使用 attrs 和
深入理解全面践行人民城市理念 深入理解oracle体系与结构
相关内容
发表评论

游客 回复需填写必要信息