Python 类型注解, Enum 还是 str Literal?

2021-02-04 10:18:37 +08:00
 Contextualist

目前在用 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 又觉得不严谨。应该如何取舍?

1961 次点击
所在节点    Python
2 条回复
karatsuba
2021-02-04 10:33:45 +08:00
不知道,不用 toml
crclz
2021-02-04 10:57:12 +08:00
都可以。像 JAVA C#这种的,用 ENUM 是标准操作。所以 python 用 enum 算不上过度封装。

如果使用你这个类的开发者很多,那么就尽量使用 Enum 。如果自己用,就使用字符串。

我个人的建议是,其实 python 作为一门动态语言,也该有动态语言的样子,就直接使用字符串就行了,约束什么的也没有必要用类型注解来做,影响开发速度。

当然,这是有依据的,例如 numpy 的 padding='zero'之类的传参,大家都没怎么抱怨这种设计。如果参数不知道填什么,大家都知道去看函数注释。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/751150

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX