簡體   English   中英

Python:解析字符串枚舉值的更好/更簡單的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM