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

如何在Python Enum的__new__方法中结合auto()实现扩展?

解决Python Enum中auto()在__new__方法里失效的问题

问题原因

你在__new__里直接用auto()是行不通的——auto()是个占位符,得由Enum的元类EnumMeta在枚举类定义阶段解析,替换成自增的整数。等到__new__创建成员实例的时候,元类的处理流程已经走完了,auto()此时没有上下文,自然生成不了正确的自增值。

可行解决方案:手动维护类计数器

直接在基类里加一个类级别的计数器,每次创建成员时递增赋值给_value_,就能实现自动生成整数枚举值的需求:

from enum import IntEnum

class TokenEnum(IntEnum):
    _counter = 0

    def __new__(cls, value):
        member = object.__new__(cls)
        # 用类计数器生成自增的枚举值
        member._value_ = cls._counter
        cls._counter += 1
        # 把传入的字符串存入rule属性
        member.rule = value
        return member

# 使用示例
class Tokens(TokenEnum):
    ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
    NUMBER = r'\d+'
    OPERATOR = r'[+\-*/]'

# 验证效果
print(Tokens.ID.value)       # 输出 0
print(Tokens.ID.rule)        # 输出 [a-zA-Z_][a-zA-Z0-9_]*
print(Tokens.NUMBER.value)   # 输出 1
print(Tokens.OPERATOR.value) # 输出 2

补充说明

如果需要从1开始计数,只需要把_counter初始值设为1就行。这种方式比依赖auto()更灵活,完全适配你把传入字符串存到rule属性的需求。

内容的提问来源于stack exchange,提问作者Juergen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:00