2016-08-04 20 views
5

Bir numaraya 'Hiçbiri' adlı bir değer ekleyebilir miyim? Örneğin Bu soru benim önceki soruya Tabii How to set a variable's subproperty?Numara türüne 'Yok' adlı bir değer eklemek mümkün mü?

ilişkilidir

from enum import Enum 
class Color(Enum): 
    None=0 #represent no color at all 
    red = 1 
    green = 2 
    blue = 3 

color=Color.None 

if (color==Color.None): 
    #don't fill the rect 
else: 
    #fill the rect with the color 

için , ben enum yukarıdaki None çalışmaz anlıyorum. ancak satıcının kodundan, böyle bir şey görüyor musunuz: bird.eye.Color=bird.eye.Color.enum.None o kadar bir flufl.enum kullanılan bir <class 'flufl.enum._enum.IntEnumValue'> olduğunu type(bird.eye.Color) kontrol etti. flufl.enum veya Enum'u kullanmanın çok farklı olmamalı. Çok teşekkürler!

+0

Yukarıdaki kodu denediğinizde ne oldu? Bir hata mesajı aldın mı? –

+2

Bir anahtar kelimeye atayamazsınız. 'Yok = *' 'SyntaxError' atar, ancak' none = * 'kullanabilirsiniz. – Pythonista

+0

@Pythonista, hiçbiri vs. ile ilgili değil. – sawreals

cevap

1

Sen Enum kurucu kullanılarak yerine, alt sınıf oluşturma yapabilirsiniz

>>> from enum import Enum 
>>> 
>>> Color = Enum('Color', {'None': 0, 'Red': 1, 'Green': 2, 'Blue': 3}) 
>>> Color.None 
<Color.None: 0 

DÜZENLEME: Bu piton 3'te piton 2 için enum34 backport kullanarak çalışır, sizinle Enum oluşturmak mümkün olacak None özniteliği, ancak nokta gösterimi kullanarak erişemeyeceksiniz. o None atanacak bir yazım hatasıdır çünkü

>>> Color.None 
SyntaxError: invalid syntax 

Garip, yine doğrudan bunu yapamaz getattr

>>> getattr(Color, 'None') 
<Color.None: 0> 
+0

Bu yalnızca Python 2'de mümkün değildir, çünkü bunlar “None” adıyla daha fazla bağışlayıcıdır ('keyword.kwlist'de yoktur). Python'da kırıldı3. – wim

+0

@wim Evet, 'enum34' backport'u kullandım. Bu biraz garip, çünkü Python3'te Enum yaratıcılığına 'Yok'la izin verecek, ancak' Color.None 'ile erişmeye çalışırken hata çıkıyor. Yine de getattr (Color, 'None') 'yapabilirsiniz. –

+0

Gerçekten garip değil - python 2 aswell'de benzer davranışlar var. Örneğin, 'setattr (my_obj,' import ', 123) 'yapabileceksiniz. Ama neden normal özellik erişimi ile alamayacağınız bir özellik belirlemek istersiniz? Bunu yapmak için sadece bir dezavantaj var .. – wim

-2

Pek yolu denedik ama bunu yapabilirsiniz:

# After defining the class Color as normal, but excluding the part for None... 
setattr(Color, 'None', 0) 

color = Color.None 
if color == Color.None: 
    ... 

Not: Seni belirtmedi çünkü Python 2 içinde istiyorum veya 3 eğer emin değil Python 2. yaptılar ve test etmek için bu makineye kurulu bir Python 3 kopyası yok.

+2

Yapabilirsin ama yapmamalısın. – SuperSaiyan

+1

Bu ayrıntılı çalışmayı yapmak için, Enum sınıfının meta sınıf sihirbazını yansıtır, bu nedenle enumun uygun bir üyesi olmayacaktır.Bu pek çok talihsiz yan etkiye sahiptir, örneğin "liste (Renk)" içinde görünmez, çarpışma önleme veya takma adlandırma mümkün değildir, vb – wim

+0

@wim - Python 3'teki standart bir modül bu mu? OP'nin 'pip' kullanarak' enum' adlı bir şey kurduğunu düşündüm. Her neyse, eminim ki tüm sihir işlerini yapmak için yapabileceğimiz bir şey var. – ArtOfWarfare

1

ile erişebilirsiniz.

Enum sınıfınızda dinamik olarak bir öznitelik belirlememelisiniz, çünkü bu, sınıfınızı hazırlamak için Enum'un kullandığı meta sınıf mantığına müdahale edecektir.

Python'un None tekiliyle ad çarpışmalarından kaçınmak için none küçük harfli bir ad kullanmalısınız. Tanımladığınız kullanım durumu için bu yaklaşımın dezavantajı yoktur.

+0

Brendan Abel'in cevabı muhtemelen benim gibi herhangi bir yan etkisi olmadan çalışır gibi görünüyor. – ArtOfWarfare

+0

Hayır. Yan etkisi, python3'te çalışmadığıdır. – wim

İlgili konular