在python Attrs包中,如何在field_transformer函数中添加字段?

问题描述 投票:0回答:1

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)
python python-attrs
1个回答
0
投票

这是如何使用属性向类添加字段的另一种方法。

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)

参考

© www.soinside.com 2019 - 2024. All rights reserved.