2016-08-04 4 views
5

Kann ich einen Wert mit dem Namen 'None' zu einer Enum hinzufügen? zum Beispiel Ist es möglich, dem Enum-Typ einen Wert mit dem Namen 'None' hinzuzufügen?

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 

Diese Frage zu meiner vorherigen Frage How to set a variable's subproperty? zusammenhängt

Natürlich verstehe ich die oben None in enum funktioniert nicht. aber aus dem Code des Anbieters, kann ich so etwas wie dies sehen: bird.eye.Color=bird.eye.Color.enum.None Ich habe die type(bird.eye.Color) es ist ein <class 'flufl.enum._enum.IntEnumValue'> so ein flufl.enum verwendet wird. Ich nehme an, es sollte nicht sehr unterschiedlich sein, eine flufl.enum oder eine Enum zu verwenden. Vielen Dank!

+0

Was ist passiert, als Sie den obigen Code ausprobiert haben? Haben Sie eine Fehlermeldung erhalten? –

+2

Sie können einem Schlüsselwort nicht zuweisen. 'None = *' würde einen 'SyntaxError' werfen, aber Sie können' none = * 'verwenden. – Pythonista

+0

@Pythonista hat Recht, wenn keine vs. keine. – sawreals

Antwort

1

Sie können dies tun, um die Enum Konstruktor, anstatt Erstellen einer Unter

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

EDIT: Dies funktioniert für Python die enum34 Rückportierung mit 2. In Python 3, können Sie die Enum mit der erstellen None Attribut, aber Sie können nicht mit Punktnotation zugreifen.

>>> Color.None 
SyntaxError: invalid syntax 

Merkwürdig ist, können Sie immer noch darauf zugreifen mit getattr

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

Dies ist nur in Python 2 möglich, weil sie mit dem 'None' Namen (in' keyword.kwlist' nicht vorhanden war). Es ist in Python3 gebrochen. – wim

+0

@wim Ja, ich habe den 'enum34' Backport benutzt. Es ist allerdings ein wenig merkwürdig, denn in Python3 wird die Enum-Erstellung mit 'None' möglich sein, aber es wird beim Versuch, mit' Color.None' darauf zuzugreifen, ein Fehler gemacht. Sie können jedoch 'getattr (Farbe, 'None') trotzdem tun. –

+0

Nicht wirklich seltsam - ähnliches Verhalten gibt es auch in Python 2. Zum Beispiel können Sie 'setattr (my_obj, 'import', 123)' tun. Aber warum sollten Sie ein Attribut setzen, das Sie mit normalem Attributzugriff nicht bekommen können? Es gibt nur einen Nachteil dabei .. – wim

-2

Nicht ganz so, wie Sie versucht, aber Sie können dies tun:

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

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

Hinweis: Ich habe dies in Python 2. Nicht sicher, ob Sie dies in Python wollen 2 oder 3, weil Sie nicht angegeben , und ich habe keine Kopie von Python 3, die auf diesem Computer zum Testen installiert ist.

+2

Sie können, aber Sie sollten nicht. – SuperSaiyan

+1

Um dies zu verdeutlichen, vermeidet dies die Metaklassenmagie, die die Enum-Klasse tut, also wird sie kein ordentliches Mitglied der Enum sein.Das hat viele unglückliche Nebenwirkungen, zum Beispiel wird es nicht in 'list (Color)' angezeigt, keine Kollisionsverhinderung oder Aliasing möglich usw. – wim

+0

@wim - Ist das ein Standardmodul in Python 3? Ich dachte, das OP hätte etwas namens 'enum' mit' pip' installiert. Wie auch immer, ich bin mir sicher, dass wir etwas tun können, damit die Magie funktioniert. – ArtOfWarfare

1

Sie das nicht direkt tun können, weil es ein Syntaxfehler zu None zuzuordnen ist.

Sie sollten auch kein Attribut für Ihre enum-Klasse dynamisch festlegen, da dies die Metaklassenlogik stört, die Enum verwendet, um Ihre Klasse vorzubereiten.

Sie sollten nur einen Kleinbuchstaben none verwenden, um den Namen Kollision mit Pythons None Singleton zu vermeiden. Für den von Ihnen beschriebenen Anwendungsfall gibt es keinen Nachteil für diesen Ansatz.

+0

Brendan Abels Antwort sieht aus wie es funktioniert wahrscheinlich ohne irgendwelche Nebenwirkungen wie meins. – ArtOfWarfare

+0

Nein. Der Nebeneffekt ist, dass es in Python3 nicht funktioniert. – wim

Verwandte Themen