我知道这不是标准用例,但我需要IntEnum在Python中动态地向派生类添加元素.请注意,使用功能API动态创建Enum是不够的.我需要在现有的枚举中添加元素.我怎样才能做到这一点?
背景:对于那些想知道为什么有人想要这样做的人.我正在包装一个库,并且在库中定义了枚举的值.我可以使用库API查询名称和值.但是我不能在初始化时这样做,因为它依赖于库在用户请求时动态加载的组件.我可以在启动时加载所有组件并使用功能API在导入时创建枚举,但这很耗时并且有副作用.
我需要创建一个枚举来表示 ISO 国家/地区代码。国家/地区代码数据来自 json 文件,可从以下位置获取:https ://github.com/lukes/ISO-3166-Countries-with-Regional-Codes
所以我所做的是:
data = json.load(open('slim-2.json'))
codes_list = [(data[i]['alpha-2'], int(data[i]['country-code']))
for i in range(len(data))]
CountryCode = enum.Enum('CountryCode', codes_list,)
names_dict = {int(data[i]['country-code']):data[i]['name']
for i in range(len(data))}
setattr(CountryCode, '_names', names_dict)
CountryCode.choices = classmethod(lambda cls:((member.value, name)
for name, member in cls.__members__.items()))
setattr(CountryCode, '__str__' ,lambda self: self.__class__._names[self.value])
Run Code Online (Sandbox Code Playgroud)
坦率地说,这段代码片段很丑陋。我研究了定义枚举类的替代方法,但无法拼凑出解决方案。有没有一种方法可以按以下形式定义枚举:
class CountryCode(enum.Enum):
data = json.load(open('slim-2.json'))
# Some code to define the enum members
@classmethod
def choices(cls):
# etc...
Run Code Online (Sandbox Code Playgroud)
关于如何执行此操作有什么建议吗?
假设我想创建以下枚举类:
from enum import Enum, unique
@unique
class Indication(Enum):
Fruit1 = 'apple'
Fruit2 = 'orange'
Fruit3 = 'banana'
Run Code Online (Sandbox Code Playgroud)
我想从 python 列表创建它,即
Listoffruits = [('Fruit1', 'apple'), ('Fruit2', 'orange'), ('Fruit3', 'banana')]
Run Code Online (Sandbox Code Playgroud)
如何有效地做到这一点?