Python中的枚举转换器

7 投票
6 回答
7434 浏览
提问于 2025-04-16 12:27

我有一个枚举类型(enum)

class Nationality:
        Poland='PL'
        Germany='DE'
        France='FR'
        ...
        Spain='ES'

我有两个方法的原型:

# I want somethink like in c#        
def convert_country_code_to_country_name(country_code):
        print Enum.Parse(typeof(Nationality),country_code)

#this a second solution ,but it has a lot of ifs

def convert_country_code_to_country_name(country_code):
        if country_code=='DE':
                print Nationality.Germany #btw how to print here 'Germany', instead 'DE'

这是我想要调用这个方法的方式:

convert_country_code_to_country_name('DE') # I want here to  print 'Germany'

我该如何在Python中实现它呢?

6 个回答

4

Python 3.4 引入了一种新的数据类型叫做 Enum(枚举),这个功能很方便,适合你的需求:

class Nationality(enum.Enum):
    Poland = 'PL'
    Germany = 'DE'
    France = 'FR'
    Spain = 'ES'

如果你想通过名字来获取枚举成员,可以这样做:

--> Nationality['France']
<Nationality.France: 'FR'>

如果你想通过值来获取枚举成员,可以这样做:

--> Nationalatiy('FR')
<Nationality.France: 'FR'>

一旦你得到了枚举成员,你可以这样使用:

--> member = Nationality('FR')
--> member.name
'France'
--> member.value
'FR'
6

最好的办法是一开始就创建一个字典。你的枚举在Python中没有意义,显得复杂得多。看起来你是在试图写Java代码,但这和Python代码的风格完全相反。

1

我的方法大概是这样的(可能不是最完美的,但你能理解我的意思):

class Nationality:
        Poland = 'PL'
        Germany = 'DE'
        France = 'FR'

        def convertToCodeFromName(name):
                return getattr(Nationality, name)

        def convertToNameFromCode(code):
                lookFor = None

                for member in dir(Nationality):
                        if (getattr(Nationality, member) == code):
                                lookFor = member
                                break
                return lookFor

print(Nationality.convertToCodeFromName("Poland"))
print(Nationality.convertToNameFromCode("PL"))

希望这对你有帮助。

撰写回答