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

Python中嵌套Enum实现问题:无法直接访问嵌套枚举属性

解决Python嵌套Enum的属性访问问题

问题根源

你当前的代码中,DataVendor.VENDOR_A是一个Enum实例,它的值是VendorA这个Enum类,但直接访问conf.data_vendor.OPEN时,Python会去DataVendor实例里找OPEN属性,而不是去它的value(即VendorA类)里找,所以会抛出AttributeError。

两种解决方法

方法1:直接通过.value访问嵌套Enum类

最简单的方式是显式获取DataVendor实例的value(即对应的Vendor Enum类),再访问其成员的值:

conf = Config(data_vendor=DataVendor.VENDOR_A)

assert conf.data_vendor.value.OPEN.value == "px_open"
assert conf.data_vendor.value.HIGH.value == "px_high"
assert conf.data_vendor.value.LOW.value == "px_low"
assert conf.data_vendor.value.CLOSE.value == "px_last"

方法2:自定义Enum的属性代理(更优雅)

通过给DataVendor添加__getattr__方法,让它自动代理嵌套Enum的属性访问,这样你可以保持原有的断言写法:

from dataclasses import dataclass
from enum import Enum


class VendorA(Enum):
    """Define price fields for VENDOR_A."""
    OPEN: str = "px_open"
    HIGH: str = "px_high"
    LOW: str = "px_low"
    CLOSE: str = "px_last"


class VendorB(Enum):
    """Define price fields for VENDOR_B."""
    OPEN: str = "open"
    HIGH: str = "high"
    LOW: str = "low"
    CLOSE: str = "close"


class DataVendor(Enum):
    """Define data vendor."""
    VENDOR_A = VendorA
    VENDOR_B = VendorB

    def __getattr__(self, name):
        # 代理访问嵌套Enum的成员值
        return getattr(self.value, name).value


@dataclass
class Config:
    """Configuration class."""
    data_vendor: DataVendor


# 原断言可直接通过
conf = Config(data_vendor=DataVendor.VENDOR_A)
assert conf.data_vendor.OPEN == "px_open"
assert conf.data_vendor.HIGH == "px_high"
assert conf.data_vendor.LOW == "px_low"
assert conf.data_vendor.CLOSE == "px_last"

原理说明

__getattr__方法会在实例找不到指定属性时被触发。这里我们通过self.value拿到对应的Vendor Enum类,再用getattr获取该类的Enum成员,最后返回成员的.value(即你定义的字符串值),从而实现了直接访问的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:45:32