[英]Python: better/simpler way of parsing string Enum values
我正在解析一些配置文件,並且應該將一個字段解析為 Enum。 假設可能有 3 個可能的值:
`foo`, `bar`, `baz`
我想將它們解析為以下枚舉值:
class ConfigField(Enum):
FOO = 'foo'
BAR = 'bar'
BAZ = 'baz'
我寫了以下 function 來做到這一點:
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,所以我不是 100% 熟悉 Enums,我希望可能有更好的方法來做到這一點。
有一個更好的方法嗎? 我正在尋找比我的parse_config_field
更簡單(並且可能更“內置”/“pythonic”)的解決方案 - 可能類似於:
value = ConfigField.get_by_value(cfg_string)
我相信您正在尋找按值訪問: ConfigField("foo")
,它給出了<ConfigField.FOO: '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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.