Zastanawiam się, jaki jest prawidłowy sposób konwersji (deserializacji) ciągu znaków na klasę Enum w języku Python. Wygląda na getattr(YourEnumType, str)
to, że spełnia swoje zadanie, ale nie jestem pewien, czy jest wystarczająco bezpieczny.
Aby być bardziej szczegółowym, chciałbym przekonwertować 'debug'
ciąg na obiekt Enum w następujący sposób:
class BuildType(Enum):
debug = 200
release = 400
python
string
serialization
enums
type-conversion
Vladius
źródło
źródło
Build.get('illegal', Build.debug)
?Enum
nie zawiera.get()
metody, ale możesz ją dodać w razie potrzeby lub po prostu utworzyćEnum
klasę bazową i zawsze dziedziczyć po niej.Build('debug')
Build('debug')
. Konstruktor klasy musi mieć wartość , czyli200
czy400
w tym przykładzie. Aby przekazać nazwę , musisz użyć nawiasów kwadratowych, jak już mówi odpowiedź.Inną alternatywą (szczególnie przydatna, gdy struny nie mapować 1-1 do swoich spraw enum) jest dodać
staticmethod
do listyEnum
, na przykład:Wtedy możesz to zrobić
question_type = QuestionType.from_str('singleSelect')
źródło
Lub musisz przekonwertować ciąg znaków na znane Enum?
Lub:
źródło
debug
ciąg na wyliczenie takich:python class BuildType(Enum): debug = 200 release = 400
__dict__
takie samo jakgetattr
? Martwię się kolizjami nazw z wewnętrznymi atrybutami Pythona ...getattr
. Nie widzę powodu do kolizji nazw. Po prostu nie możesz ustawić słowa kluczowego jako pola klasy.Moje rozwiązanie problemu w stylu Java. Mam nadzieję, że to komuś pomoże ...
źródło
Ulepszenie odpowiedzi @rogueleaderr:
źródło
Chcę tylko powiadomić, że to nie działa w Pythonie 3.6
Będziesz musiał podać dane jako krotkę, taką jak ta
EDYCJA: Okazuje się, że to nieprawda. Podziękowania dla komentatora za wskazanie mojego błędu
źródło
,
(przecinek) po każdym elemencie (tak jakby elementy były listą), to potraktuje każdy element jako krotkę. (czylia = 'aaa',
właściwie to samo coa = ('aaa',)
),
za każdą linią podczas definiowania wyliczenia, które w jakiś sposób zmieniło wartości w krotki