
目前在用 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 又觉得不严谨。应该如何取舍?
1 karatsuba Feb 4, 2021 不知道,不用 toml |
2 crclz Feb 4, 2021 都可以。像 JAVA C#这种的,用 ENUM 是标准操作。所以 python 用 enum 算不上过度封装。 如果使用你这个类的开发者很多,那么就尽量使用 Enum 。如果自己用,就使用字符串。 我个人的建议是,其实 python 作为一门动态语言,也该有动态语言的样子,就直接使用字符串就行了,约束什么的也没有必要用类型注解来做,影响开发速度。 当然,这是有依据的,例如 numpy 的 padding='zero'之类的传参,大家都没怎么抱怨这种设计。如果参数不知道填什么,大家都知道去看函数注释。 |