目前在用 attrs 做 TOML 配置的结构定义。遇到有些条目是联合类型,可以指定关键字也可以给具体数值,比如以下 TOML:
attr0 = 0.98
# 或者
#attr0 = "magicx"
那么这个条目的定义有两种写法,用 str Literal:
import attr
from typing import Union, Literal
@attr.s(auto_attribs=True)
class Config:
attr0: Union[float, Literal["magicx"]]
...
config = parse_config()
if config.attr0 == "magicx":
...
或者用 Enum:
import attr
from typing import Union
from enum import Enum
class Attr0KW(Enum):
MAGICX = "magicx"
@attr.s(auto_attribs=True)
class Config:
attr0: Union[float, Attr0KW]
...
config = parse_config()
if config.attr0 is Attr0KW.MAGICX:
...
像这种只有一个关键字的,写个 Enum 又觉得过度封装了,但用 str Literal 又觉得不严谨。应该如何取舍?