A W*_*ebb 4 python enums inference constants dry
我刚刚开始使用 Python 进行服务器端编程(来自 TypeScript),而.valueEnum 键入的冗长让我考虑根本不使用它。
在 TypeScript 中,枚举的值是这样检索的。
enum CompassDirection {
North = "North",
}
// I do not have to ask for the value
const isEqual = CompassDirection.North === "North" ? true : false
console.log(isEqual) // returns true
Run Code Online (Sandbox Code Playgroud)
但在Python中,我相信检索值的唯一方法是.value像这样使用..
from enum import Enum
class CompassDirection(Enum):
NORTH = 'NORTH'
isEqual = CompassDirection.NORTH == 'NORTH'
print(isEqual) // false
isEqual = CompassDirection.NORTH.value == 'NORTH'
print(isEqual) // true
Run Code Online (Sandbox Code Playgroud)
我使用 Enum 的目的是为了进行推理,因此我不必在代码中重复键入诸如“NORTH”之类的字符串。
如果我创建了一个函数,我也必须在任何地方调用它 -例如
def get_enum_value(enum):
return enum.value
# Calling this every time I want to use the enum.
get_enum_value(CompassDirection.NORTH)
get_enum_value(XEnum.Value)
get_enum_value(YEnum.Value)
Run Code Online (Sandbox Code Playgroud)
然而,如果我不这样做,我就会.value在各处重复输入,我发现这可能是因为我的 TypeScript 偏见而违反直觉。
有没有一种方法可以使用枚举或字典实现我想要的推理,使我的代码尽可能干燥,这样我就可以避免输入字符串?
笔记:
我不介意创建一些常量,但我可以看到我的导入对于代码分割/重用来说变得很长。
我错过了什么吗?我想尽快了解这一点。
解决问题的直接方法是str继承Enum1:
class CompassDirection(str, Enum):
NORTH = 'NORTH'
>>> print(CompassDirection.NORTH == 'NORTH')
True
Run Code Online (Sandbox Code Playgroud)
长期的解决方案是认识到您不应该再使用字符串,而应该使用枚举成员,并使用is:
somevar = CompassDirections.NORTH
#
# some intervening code
#
print(somevar is CompassDirections.NORTH)
# True
Run Code Online (Sandbox Code Playgroud)
如果从用户、配置文件等获取输入,则只需处理字符串"NORTH",然后您需要立即转换为枚举:
result = input('Enter direction')
result = CompassDirection(result.upper())
Run Code Online (Sandbox Code Playgroud)
1 Python 3.11 将有一个StrEnum类型,这将确保值已经是类型str。
声明:我是Python stdlibEnum、enum34backport和Advanced Enumeration ( aenum)库的作者 。