Python Attrs包:如何在field_transformer函数中正确添加字段?
在attrs的field_transformer中添加字段的正确方式
attrs官方文档的《自动字段转换与修改》章节明确说明:你可以添加转换器、修改类型,甚至完全移除属性或创建新属性!,但同时API文档也强调,开发者不应自行实例化Attribute类。
但直接在field_transformer函数中用attrs.field()添加字段会报错:
import attrs def transformer(cls, fields): fields.append(attrs.field(name='bar')) return fields @attrs.define(field_transformer=transformer) class A: pass A(bar=1)
执行后会抛出TypeError: field() got an unexpected keyword argument 'name';如果改用alias参数,则会出现AttributeError: '_CountingAttr' object has no attribute 'name'。
正确实现方式
通过attrs.Attribute.from_counting_attr()方法来创建合法的Attribute实例,再加入字段列表即可:
import attrs def transformer(cls, fields): # 先创建一个内部的_CountingAttr对象 ca = attrs.field() # 用官方提供的方法生成合法的Attribute实例,指定字段名、类型等参数 new_field = attrs.Attribute.from_counting_attr(name="foo", ca=ca, type=int) # 将新字段加入字段列表(可调整位置) return [new_field, *fields] @attrs.define(field_transformer=transformer) class A: pass # 正常使用新增的字段 A(foo=1)
原理说明
attrs.field()返回的是_CountingAttr对象,它是Attribute的内部前置对象,不能直接作为类字段使用Attribute.from_counting_attr()是官方提供的合法转换途径,能将_CountingAttr转换为可用的Attribute实例,同时支持指定字段名、类型等属性参数
内容的提问来源于stack exchange,提问作者slaughter98
相关产品推荐
相关产品推荐

