2011-05-19 28 views

cevap

8

İstediğiniz şeyi yapmanın daha iyi (ve daha çok "pythonik") yolları vardır.

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

Veya çizgisinde bir sözlük kullanmak:

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

The sırası korunacaktır

Ya (Bu modifiye gerekiyorsa veya listeyi) bir demet kullanın Benim düşünceme göre, daha okunaklı ve açık olarak tercih edilir.

overkill muhtemelen olsa bir namedtuple da, özel durumlarda yararlı olabilir

:

PL, FR, DE = range(3) 

bir sınıfta sarın ve viyola: Ben böyle bir şey gördük

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

milliyet isimlerini kaçırıyorsun. Onları – user278618

+0

@ user278618 olmalı - Kısırlık için onları dışarıda bıraktım. Fikir, "Milliyet" sınıfınızda bir yerde bir arama tablosu kullanmanız gerektiğiydi. Sınıf özniteliklerinizi yerine dizeleri yerine kolayca kullanabilirsiniz. –

5

Yapamazsınız. Python sınıf öğelerinin sırasını saklamaz ve dir() bunları herhangi bir sırayla döndürür. Gerçekten tamsayılar dizelerden bir eşleme gerektiren yapmak senin yorumun görünce

, sen aslında tam olarak bunu yapmalıdır:

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

Bu enum'i kullanarak, farklı css ve dil içeren birkaç sitede bulunan ve yalnızca özellik değerinin her bir sitede aynı olduğu bir değer değeri ayarlamak için kullanıyorum. Bu seçimden milliyeti seçmeliyim ve seçeneklerin değerleri 0,1,2'dir. Bu dökümünü C# olarak kullanıyorum, bu yüzden bu fikri aldım. – user278618

3

Neden sadece yerine dizeleri numaraları gibi değerleri tanımlamaz: iki harfli isimleri erişmek gerekirse

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

, onları eşleştiren bir tablo sağlayabilir. (Ya da diğer yolu eşleyen bir sözlük, vb.)

3

, numaralandırma için bir ad alanınız var.Kullanılması

8

ya oluşturabileceğiniz enum34 backport veya aenum bir Enum uzman:

# 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 

ve kullanımda

: Yukarıdaki daha kolay yazılır

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

aenum kullanarak :

katma işlevselliğe sahip
# using aenum 
from aenum import Enum, MultiValue 

class Nationality(Enum): 
    _init_ = 'value fullname' 
    _settings_ = MultiValue 

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

    def __int__(self): 
     return self.value 

:

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

Açıklama: Ben Python stdlib Enum yazarı enum34 backport ve Advanced Enumeration (aenum) kütüphane duyuyorum.

+0

Harika çalışıyor. Çok teşekkürler! –