使用 Python Enum 或 Dictionary 映射常量并通过推理保持 DRY 的最佳方法

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 偏见而违反直觉。

有没有一种方法可以使用枚举或字典实现我想要的推理,使我的代码尽可能干燥,这样我就可以避免输入字符串?

笔记:

我不介意创建一些常量,但我可以看到我的导入对于代码分割/重用来说变得很长。

我错过了什么吗?我想尽快了解这一点。

Eth*_*man 5

解决问题的直接方法是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 stdlibEnumenum34backportAdvanced Enumeration ( aenum)库的作者 。