用动态成员定义枚举的更Python方式

发布于 2021-01-29 16:17:56

我需要创建一个枚举来表示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])

坦率地说,此代码段很丑陋。我研究了定义枚举类的其他方法,但无法拼凑出解决方案。有没有一种方法可以以以下形式定义枚举:

class CountryCode(enum.Enum):

    data = json.load(open('slim-2.json'))
    # Some code to define the enum members

    @classmethod
    def choices(cls):
    # etc...

有关如何执行此操作的任何建议?

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这个怎么样?

    data = json.load(open('slim-2.json'))
    CountryCode = enum.Enum('CountryCode', [
        (x['alpha-2'], int(x['country-code'])) for x in data
    ])
    CountryCode._names = {x['alpha-2']: x['name'] for x in data}
    CountryCode.__str__ = lambda self: self._names[self.name]
    CountryCode.choices = lambda: ((e.value, e.name) for e in CountryCode)
    
    • 替换[...data[i]... for i in range(len(data))][...x... for x in data]; 您可以data在不使用索引的情况下排序序列(列表,在代码中)。
    • 使用CountryCode.attr = ...一致; 而不是混合CountryCode.attr = ...setattr(CountryCode, 'attr', ...)


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看