首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中将字符串转换为枚举

在Python中将字符串转换为枚举
EN

Stack Overflow用户
提问于 2016-12-31 18:19:00
回答 7查看 129.7K关注 0票数 223

我想知道将字符串转换(反序列化)为Python的Enum类的正确方法是什么。看起来getattr(YourEnumType, str)可以完成这项工作,但我不确定它是否足够安全。

更具体地说,我想将一个'debug'字符串转换为一个枚举对象,如下所示:

代码语言:javascript
运行
复制
class BuildType(Enum):
    debug = 200
    release = 400
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-12-31 23:06:05

此功能已内置于Enum 1中

代码语言:javascript
运行
复制
>>> from enum import Enum
>>> class Build(Enum):
...   debug = 200
...   build = 400
... 
>>> Build['debug']
<Build.debug: 200>

成员名称区分大小写,因此如果要转换用户输入,则需要确保大小写匹配:

代码语言:javascript
运行
复制
an_enum = input('Which type of build?')
build_type = Build[an_enum.lower()]

1官方文档:Enum programmatic access

票数 359
EN

Stack Overflow用户

发布于 2018-03-02 07:51:10

另一种选择(如果字符串不是1-1映射到枚举大小写时特别有用)是在Enum中添加一个staticmethod,例如:

代码语言:javascript
运行
复制
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')

票数 27
EN

Stack Overflow用户

发布于 2019-06-13 01:07:25

我对这个问题的类似Java的解决方案。希望它能帮助一些人..。

代码语言:javascript
运行
复制
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`
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41407414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档