2016-03-24 14 views
1

Önceden tanımlanmış tek karakter sabitlerine (veritabanında saklamak için iyi) ve dize yorumuna sahip bir enum istiyorum. oPython 2: Bir dizeyi dize yorumlarıyla yapmanın en zarif/pythonik yolu nedir?

Nasıl yapmak yapmanın daha şık bir yolu olmalı

class Fruits(Enum): 
    APPLE = 'A' 
    PEAR = 'P' 
    BANANA = 'B' 
    def __unicode__(self): 
     if self == APPLE: return "Crunchy Apple" 
     if self == PEAR: return "Sweet Pear" 
     if self == BANANA: return "Long Banana" 

Ama

fruit = Fruits.APPLE 
print fruit.__unicode__() 

AttributeError: 'unicode' object has no attribute '__unicode__' 

Ve üstelik

verir: İşte düşünüyorum budur daha iyi?

+0

Python2'yi kullanıyor görünüyorsunuz. Python2 veya Python3'ü kullanıp kullanmadığınızı onaylayabilir misiniz? (Emin olmak için sys.version’i inceleyebilirsiniz).) –

+0

Fruits.TYPE_APPLE işlevi nereden geldi? Sadece 'Fruits.APPLE' öğesini tanımladınız. Sorudaki kodu bellekten yeniden yazdıysanız, gerçekte çalıştığınız bir dosyadan kopyalayıp yapıştırın veya bir dahaki sefere gerçek bir etkileşimli oturum açın. – user2357112

+0

@Rob Python 2 ile daha çok ilgileniyorum – Digital

cevap

-1

enum34 modülünde istediğiniz gibi bir şey var. Muhtemelen

from enum import Enum 

class Fruits(Enum): 
    apple = 'A' 
    pear = 'P' 
    banana = 'B' 

fruit = Fruits.apple 

print fruit.value 
>> 'A' 

daha iyi kullanıyor tamsayılar kullanarak

from enum import Enum 

class Fruits(Enum): 
    apple = 1 
    pear = 2 
    banana = 3 

fruit = Fruits.apple 

print fruit.value 
>> 1 

Ve (örneğin bir veritabanından) onun değer alırsanız nesneyi yeniden oluşturun:

fruit = Fruits(1) 
+0

Bu OP'nin sorusuna cevap vermiyor. –

+0

Ah aslında doğru düşünüyorsun. Ama istenen sting yorumlama için fruit.name var. –

3

Birkaç gözlemler:

  • Doğrudan __dunder__ yöntemlerini aramamalısınız; yerine eşleştirme komutu kullanın: Ben senin sorunu

kullanma çoğaltmak alamıyorum unicode yerine __unicode__

  • ait stdlib Enum (3.4+) veya enum34 backport (Python 2.x) yapmanız gerekecektir

    class EnumWithDescription(Enum): 
        def __new__(cls, value, desc): 
         member = object.__new__(cls) 
         member._value_ = value 
         member.description = desc 
         return member 
        def __unicode__(self): 
         return self.description 
    
    class Fruits(EnumWithDescription): 
        _order_ = 'APPLE PEAR BANANA' # if using Python 2.x and order matters 
        APPLE = 'A', 'Crunchy Apple' 
        PEAR = 'P', 'Sweet Pear' 
        BANANA = 'B', 'Long Banana' 
    

    ve kullanımda:

    - bu zor yoldan kendi taban Enum sınıf yapmak Eğer kullanabiliyorsa 10
    >>> fruit = Fruits.APPLE 
    >>> unicode(fruit) 
    u'Crunchy Apple' 
    

    aenum library bunun daha kolay bir zaman sahip olacaktır:

    from aenum import Enum 
    
    class Fruits(Enum, init='value description'): 
        APPLE = 'A', 'Crunchy Apple' 
        PEAR = 'P', 'Sweet Pear' 
        BANANA = 'B', 'Long Banana' 
        def describe(self): 
         return self.description 
    

    ve kullanımda

    :
    fruit = Fruits.APPLE 
    fruit.describe() 
    

    Not

    unicode olduğundan emin Python 3'te varsayılan olarak adı describe olarak değiştirdim.


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

  • İlgili konular