2011-05-19 95 views
6

詮釋我有一個枚舉國籍:轉換枚舉在Python

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

我如何轉換一些這方面的枚舉在這種或類似的方式來詮釋:

position_of_enum = int(Nationality.Poland) # here I want to get 0 

我知道我能做到它如果我有代碼:

counter=0 
for member in dir(Nationality): 
    if getattr(Nationality, member) == code: 
     lookFor = member 
     counter += 1 
return counter 

但我沒有,這種方式看起來太大python。我確信有更簡單的事情。

+0

一個類不是枚舉。因此,你無法比較。 – 2011-05-19 15:01:38

回答

8

有更好的(和更「pythonic」)做你想做的方式。

要麼使用一個元組(或列表,如果需要修改),其中訂單將被保留:

code_lookup = ('PL', 'DE', 'FR') 
return lookup.index('PL') 

或者使用詞典的線沿線的:

code_lookup = {'PL':0, 'FR':2, 'DE':3} 
return code_lookup['PL'] 

的在我看來,後者更可取,因爲它更具可讀性和明確性。

一個namedtuple也可能是有用的,在特定情況下,雖然它可能是矯枉過正:

import collections 
Nationalities = collections.namedtuple('Nationalities', 
             ['Poland', 'France', 'Germany']) 
nat = Nationalities('PL', 'FR', 'DE') 
print nat.Poland 
print nat.index(nat.Germany) 
+0

你想念國籍的名字。我必須擁有它們 – user278618 2011-05-19 15:09:08

+0

@ user278618 - 爲了簡潔起見,我將它們排除在外。這個想法是,你會在你的'國籍'類的某個地方使用某種查詢表。您可以輕鬆替換您的類屬性,而不是字符串。 – 2011-05-19 15:22:09

5

你不行。 Python不存儲類元素的順序,並且dir()將以任何順序返回它們。

從您的評論,你真的確實需要從字符串到整數的映射看,你其實應該做的正是:

code_lookup = { 
    'PL': ("Poland", 0), 
    'DE': ("Germany", 1), 
    'FR': ("France", 2), 
    ... 
} 
+0

我使用這個枚舉來設置選擇的值,它是在幾個不同的CSS和語言的網站,並且只有值屬性是在每個站點相同。從這個選擇我必須選擇國籍,選項的值是0,1,2。我在c#中使用這個投射,所以這是從我接受這個想法。 – user278618 2011-05-19 15:07:10

3

你爲什麼不只是定義值作爲數字而不是字符串:

class Nationality: 
    POLAND = 0 
    GERMANY = 1 
    FRANCE = 2 

如果您需要訪問的兩個字母的名字,你可以簡單地提供它們映射表。 (或另一種方式映射的字典等)

3

我所看到的是這樣的:

PL, FR, DE = range(3) 

的一類包裹它,中提琴 ,你有一個枚舉的命名空間。

8

無論使用的enum34 backportaenum 您可以創建一個專門的Enum

# using enum34 
from enum import Enum 

class Nationality(Enum): 

    PL = 0, 'Poland' 
    DE = 1, 'Germany' 
    FR = 2, 'France' 

    def __new__(cls, value, name): 
     member = object.__new__(cls) 
     member._value_ = value 
     member.fullname = name 
     return member 

    def __int__(self): 
     return self.value 

,並在使用中:

>>> print(Nationality.PL) 
Nationality.PL 
>>> print(int(Nationality.PL)) 
0 
>>> print(Nationality.PL.fullname) 
'Poland' 

上面更容易編寫使用aenum

​​

其具有的附加功能:

>>> Nationality('Poland') 
<Nationality.PL: 0> 

披露:我是Python stdlib Enum的作者,enum34 backportAdvanced Enumeration (aenum)庫。

+0

工程很棒。非常感謝! – 2017-01-18 22:23:56