Python:解析字符串枚举值的更好/更简单的方法 问题:

Python:解析字符串枚举值的更好/更简单的方法 问题:,python,parsing,enums,Python,Parsing,Enums,我正在解析一些配置文件,其中一个字段应该解析为枚举。假设有3个可能的值: `foo`, `bar`, `baz` 我想将它们解析为以下枚举值: class ConfigField(Enum): FOO = 'foo' BAR = 'bar' BAZ = 'baz' 到目前为止,我尝试了什么: 为此,我编写了以下函数: def parse_config_field(x: str) -> ConfigField: for key, val in Config

我正在解析一些配置文件,其中一个字段应该解析为枚举。假设有3个可能的值:

`foo`, `bar`, `baz`
我想将它们解析为以下枚举值:

class ConfigField(Enum):
    FOO = 'foo'
    BAR = 'bar'
    BAZ = 'baz'
到目前为止,我尝试了什么: 为此,我编写了以下函数:

def parse_config_field(x: str) -> ConfigField:
    for key, val in ConfigField.__members__.items():
        if x == val.value:
            return val
    else:
        raise ValueError('invalid ConfigField: ' + str(x))
但我认为这是丑陋和太复杂的事情如此简单和直接。 我还考虑了将枚举字段的名称小写:

def parse_config_field2(x: str) -> ConfigField:
    value = ConfigField.__members__.get(x.lower(), None)
    if value is None:
        raise ValueError('invalid ConfigField: ' + str(x))
    else:
        return value
它稍微短了一点,但仍然很难看,更糟糕的是,它在配置值(在一些文本配置文件中)和
ConfigField
之间创建了直接依赖关系,我对此感到不舒服

我最近刚从python2切换到python3,所以我对Enum不是100%熟悉,我希望有更好的方法来实现这一点

问题: 有更好的方法吗?我正在寻找比我的
parse\u config\u field
更简单(也许更“内置”/“pythonic”)的解决方案-可能类似于:

value = ConfigField.get_by_value(cfg_string)

我相信您正在寻找通过值进行访问:
ConfigField(“foo”)
,它提供了

将引发
ValueError
以使用不存在的值进行解析:

>>> ConfigField("not foo")
ValueError: 'not foo' is not a valid ConfigField
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Program Files\Python38\lib\enum.py", line 309, in __call__
    return cls.__new__(cls, value)
  File "C:\Program Files\Python38\lib\enum.py", line 600, in __new__
    raise exc
  File "C:\Program Files\Python38\lib\enum.py", line 584, in __new__
    result = cls._missing_(value)
  File "C:\Program Files\Python38\lib\enum.py", line 613, in _missing_
    raise ValueError("%r is not a valid %s" % (value, cls.__name__))
ValueError: 'not foo' is not a valid ConfigField
>>配置字段(“非foo”)
ValueError:“not foo”不是有效的配置字段
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
调用中第309行的文件“C:\Program Files\Python38\lib\enum.py”__
返回cls.\uuuu新建\uuuuu(cls,值)
文件“C:\Program Files\Python38\lib\enum.py”,第600行,新__
加薪
文件“C:\Program Files\Python38\lib\enum.py”,第584行,在新的__
结果=cls.\u缺失\u(值)
文件“C:\Program Files\Python38\lib\enum.py”,第613行,在\u中缺失_
raise VALUERROR(“%r”不是有效的%s“%(值,cls.\uuu name\uuu))
ValueError:“not foo”不是有效的配置字段

我相信您正在寻找按值访问:
ConfigField(“foo”)
,它提供了

将引发
ValueError
以使用不存在的值进行解析:

>>> ConfigField("not foo")
ValueError: 'not foo' is not a valid ConfigField
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Program Files\Python38\lib\enum.py", line 309, in __call__
    return cls.__new__(cls, value)
  File "C:\Program Files\Python38\lib\enum.py", line 600, in __new__
    raise exc
  File "C:\Program Files\Python38\lib\enum.py", line 584, in __new__
    result = cls._missing_(value)
  File "C:\Program Files\Python38\lib\enum.py", line 613, in _missing_
    raise ValueError("%r is not a valid %s" % (value, cls.__name__))
ValueError: 'not foo' is not a valid ConfigField
>>配置字段(“非foo”)
ValueError:“not foo”不是有效的配置字段
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
调用中第309行的文件“C:\Program Files\Python38\lib\enum.py”__
返回cls.\uuuu新建\uuuuu(cls,值)
文件“C:\Program Files\Python38\lib\enum.py”,第600行,新__
加薪
文件“C:\Program Files\Python38\lib\enum.py”,第584行,在新的__
结果=cls.\u缺失\u(值)
文件“C:\Program Files\Python38\lib\enum.py”,第613行,在\u中缺失_
raise VALUERROR(“%r”不是有效的%s“%(值,cls.\uuu name\uuu))
ValueError:“not foo”不是有效的配置字段