gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:37:05 25 4
gpt4 key购买 nike

我刚开始使用 Python 进行服务器端编程(来自 TypeScript),为 Enum 输入 .value 的冗长让我考虑根本不使用它。

在 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

但在 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

我使用 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)

然而,如果我不这样做,我就会在各处重复输入 .value,我发现这违反直觉,这可能是因为我的 TypeScript 偏见。

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

注意:

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

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

最佳答案

您的问题的直接解决方案是从 str 以及 Enum1 继承:

class CompassDirection(str, Enum):
NORTH = 'NORTH'

>>> print(CompassDirection.NORTH == 'NORTH')
True

长期的解决方案是意识到你不应该再使用字符串,而是枚举成员,并且使用 is:

somevar = CompassDirections.NORTH
#
# some intervening code
#
print(somevar is CompassDirections.NORTH)
# True

如果从用户、配置文件等处获取输入,您应该只需要处理字符串 "NORTH",然后您会希望立即转换为枚举:

result = input('Enter direction')
result = CompassDirection(result.upper())

1 Python 3.11 将有一个 StrEnum 类型,这将确保值已经是 str 类型。


披露:我是 Python stdlib Enum 的作者, enum34 backport , 和 Advanced Enumeration (aenum)图书馆。

关于python - 使用 Python Enum 或 Dictionary 映射常量并通过推理保持 DRY 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69457582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com