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
相关产品推荐
相关产品推荐

