You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:52:41