Python Attrs 的文档,自动字段转换和修改部分指出
...您可以添加转换器、更改类型,甚至删除属性 完全或创建新的!”(强调)。
它还在有关 Attribute 的 API 文档中指出“您永远不应该自己实例化此类。”
但是,如果您尝试在
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'
。如果您使用“别名”,您会得到 AttributeError: '_CountingAttr' object has no attribute 'name'
。
在
field_transformer
函数中添加字段的正确方法是什么?
编辑: 我能够通过以下方式让事情发挥作用:
import attrs
def transformer(cls, fields):
ca = attrs.field()
f = attrs.Attribute.from_counting_attr(name="foo", ca=ca, type=int)
return [f, *fields]
@attrs.define(field_transformer=transformer)
class A:
pass
A(foo=1)
这是如何使用属性向类添加字段的另一种方法。
from attrs import define, field, make_class
class Foo:
pass
Foo = make_class(Foo.__name__, {'bar': field(alias='bar')}, bases=(Foo,))
foo = Foo(bar=1)
foo # Foo(bar=1)
或者,如果您的类已经定义了其他属性,则可以使用以下方法。
@define()
class Foo:
foo: int
Foo = make_class(Foo.__name__, {'bar': field(alias='bar')}, bases=(Foo,))
foo = Foo(foo=10, bar=1)
foo # Foo(foo=10, bar=1)