Python:解析字符串枚举值的更好/更简单的方法 问题:
我正在解析一些配置文件,其中一个字段应该解析为枚举。假设有3个可能的值: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
`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”不是有效的配置字段