Python Attrs的文档,Automatic Field Transformation and Modification部分规定

...您可以添加转换器、更改类型甚至删除属性 完全或create new ones!"(强调部分添加).

它还在有关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函数中添加字段的正确方法是什么?

Edit: 我能够使用以下内容:

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)

推荐答案

Method of adding class attribute dynamically with attrs

这是如何向具有属性的类添加字段的另一种方法.

from attrs import define, field, make_class

class Foo:
    pass

Foo = make_class(Foo.__name__, {'bar': field(alias='bar')}, 
                 bases=(Foo,), field_transformer=None)

foo = Foo(bar=1) 
foo # Foo(bar=1)

或者,如果您的类已经定义了其他属性,那么以下操作也适用.

@define()
class Foo:
    foo: int

Foo = make_class(Foo.__name__, {'bar': field(alias='bar')}, 
                 bases=(Foo,), field_transformer=None)

foo = Foo(foo=10, bar=1) 
foo # Foo(foo=10, bar=1)

NOTE:如果必须使用转换函数(例如transformer_func),则在make_class函数中使用field_transformer=transformer_func.

参考

Python相关问答推荐

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

'discord.ext. commanders.cog没有属性监听器'

如何让剧作家等待Python中出现特定cookie(然后返回它)?

如何访问所有文件,例如环境变量

删除字符串中第一次出现单词后的所有内容

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

使用Python更新字典中的值

Scrapy和Great Expectations(great_expectations)—不合作

当点击tkinter菜单而不是菜单选项时,如何执行命令?

当我try 在django中更新模型时,模型表单数据不可见

通过ManyToMany字段与Through在Django Admin中过滤

重置PD帧中的值

Pandas:填充行并删除重复项,但保留不同的值

将一个双框爆炸到另一个双框的范围内

用fft计算指数复和代替求和来模拟衍射?

你能把函数的返回类型用作其他地方的类型吗?'

对数据帧进行分组,并按组间等概率抽样n行

如何将一个文件的多列导入到Python中的同一数组中?

为什么在不先将包作为模块导入的情况下相对导入不起作用

为什么在更新Pandas 2.x中的列时,数据类型不会更改,而在Pandas 1.x中会更改?