Интересно, как правильно преобразовать (десериализовать) строку в класс Python Enum. Похоже, getattr(YourEnumType, str)
работает, но я не уверен, достаточно ли это безопасно.
Чтобы быть более конкретным, я хотел бы преобразовать 'debug'
строку в объект Enum следующим образом:
class BuildType(Enum):
debug = 200
release = 400
Build.get('illegal', Build.debug)
?Enum
не имеет.get()
метода, но вы можете добавить его по мере необходимости или просто создать базовыйEnum
класс и всегда наследовать от него.Build('debug')
Build('debug')
. Конструктор класса должен принимать значение , т.е.200
или400
в этом примере. Чтобы передать имя, вы должны использовать квадратные скобки, как уже сказано в ответе.Другая альтернатива (особенно полезная, если ваши строки не сопоставляют 1-1 с вашими случаями перечисления) - добавить
staticmethod
в вашEnum
, например:Тогда ты можешь сделать
question_type = QuestionType.from_str('singleSelect')
источник
Или вам нужно преобразовать строку в известный Enum?
Или:
источник
debug
строку в такое перечисление:python class BuildType(Enum): debug = 200 release = 400
__dict__
же, какgetattr
? Меня беспокоят конфликты имен с внутренними атрибутами Python ....getattr
. Я не вижу причин для коллизии имен. Вы просто не можете установить ключевое слово как поле класса.Мое Java-подобное решение проблемы. Надеюсь, это кому-то поможет ...
источник
Улучшение ответа @rogueleaderr:
источник
Я просто хочу уведомить, что это не работает в python 3.6
Вам нужно будет предоставить данные в виде кортежа, подобного этому
РЕДАКТИРОВАТЬ: это оказывается ложным. Благодарим комментатора за указание на мою ошибку
источник
,
(запятую) после каждого элемента (как если бы элементы были списком), тогда каждый элемент будет рассматриваться как кортеж. (т.е.a = 'aaa',
фактически то же самое, что иa = ('aaa',)
),
почему- то подумал, что вам нужно поместить за каждой строкой при определении перечисления, которое каким-то образом превращает значения в кортежи