我想知道将字符串转换(反序列化)为Python的Enum类的正确方法是什么。看起来getattr(YourEnumType, str)
可以完成这项工作,但我不确定它是否足够安全。
更具体地说,我想将一个'debug'
字符串转换为一个枚举对象,如下所示:
class BuildType(Enum):
debug = 200
release = 400
发布于 2016-12-31 23:06:05
此功能已内置于Enum 1中
>>> from enum import Enum
>>> class Build(Enum):
... debug = 200
... build = 400
...
>>> Build['debug']
<Build.debug: 200>
成员名称区分大小写,因此如果要转换用户输入,则需要确保大小写匹配:
an_enum = input('Which type of build?')
build_type = Build[an_enum.lower()]
1官方文档:Enum programmatic access
发布于 2018-03-02 07:51:10
另一种选择(如果字符串不是1-1映射到枚举大小写时特别有用)是在Enum
中添加一个staticmethod
,例如:
class QuestionType(enum.Enum):
MULTI_SELECT = "multi"
SINGLE_SELECT = "single"
@staticmethod
def from_str(label):
if label in ('single', 'singleSelect'):
return QuestionType.SINGLE_SELECT
elif label in ('multi', 'multiSelect'):
return QuestionType.MULTI_SELECT
else:
raise NotImplementedError
然后就可以执行question_type = QuestionType.from_str('singleSelect')
了
发布于 2019-06-13 01:07:25
我对这个问题的类似Java的解决方案。希望它能帮助一些人..。
from enum import Enum, auto
class SignInMethod(Enum):
EMAIL = auto(),
GOOGLE = auto()
@classmethod
def value_of(cls, value):
for k, v in cls.__members__.items():
if k == value:
return v
else:
raise ValueError(f"'{cls.__name__}' enum not found for '{value}'")
sim = SignInMethod.value_of('EMAIL')
assert sim == SignInMethod.EMAIL
assert sim.name == 'EMAIL'
assert isinstance(sim, SignInMethod)
# SignInMethod.value_of("invalid sign-in method") # should raise `ValueError`
https://stackoverflow.com/questions/41407414
复制相似问题