Python 使用枚举在';它不编码基础值吗?

Python 使用枚举在';它不编码基础值吗?,python,python-3.x,enums,magic-string,Python,Python 3.x,Enums,Magic String,我理解在将人类可读的字符串转换为基础(例如数字)值时使用Enum的意义,其中FederalHoliday类就是一个很好的例子 但我正在考虑的用例是,函数参数仅限于一组可能的值,这些值当前作为“魔术字符串”传递。因此,在这里实现Enum并不能真正提高代码的可读性(如果有的话,它会使代码更加混乱)。将一个字符串转换为枚举,只比较实际上是同一个字符串的内容(即枚举的名称)感觉有些过分了 有一个非常棒的列表,列出了枚举的一般优点,但我不确定其中有多少适用于这种情况 为了阐明我所指的情况,这里有一个例子,

我理解在将人类可读的字符串转换为基础(例如数字)值时使用
Enum
的意义,其中
FederalHoliday
类就是一个很好的例子

但我正在考虑的用例是,函数参数仅限于一组可能的值,这些值当前作为“魔术字符串”传递。因此,在这里实现
Enum
并不能真正提高代码的可读性(如果有的话,它会使代码更加混乱)。将一个字符串转换为
枚举
,只比较实际上是同一个字符串的内容(即
枚举
的名称)感觉有些过分了

有一个非常棒的列表,列出了枚举的一般优点,但我不确定其中有多少适用于这种情况

为了阐明我所指的情况,这里有一个例子,其中有一个函数可以打印一个字符串,该字符串具有
mode
指定的特定大小写:

def print_my_string(my_string, mode):
    if mode == 'l':
        print(my_string.lower())
    elif mode == 'u':
        print(my_string.upper())
    elif mode == 'c':
        print(my_string.capitalize())
    else:
        raise ValueError("Unrecognised mode")
要查看此操作,请运行以下命令:

for mode in ['l', 'u', 'c']:
    print_my_string("RaNdoM CAse StRING", mode)
给出:

random case string
RANDOM CASE STRING
Random case string
所以我的问题是:

当字符串不代表下面的另一个值时,
Enum
有什么好处?有没有办法让代码更健壮?它增加了什么吗?


我读过的其他东西:

通常主要是关于
Enum
s,尤其是当字符串表示下面的另一个值时:

这似乎有一个类似于我的示例(Enum下是可互操作的),但我很难理解围绕它的技术讨论,它只显示设置
Enum
,而不是使用它:


好吧,关于代码的清晰度可能取决于de person和样式,但是enum让它更清晰,如果您需要更改要用作标志的字符串,您必须在使用和enum时重构所有代码,您只需要在enum类中更改它。 对我来说,使用枚举是有意义的:

from enum import Enum

class PrintFlag(Enum):
  L = "lower"
  U = "upper"
  C = "capitalize"

def print_my_string(my_string, mode):
    action_dict = {
      PrintFlag.L : str.lower,
      PrintFlag.U : str.upper,
      PrintFlag.C : str.capitalize,
    }
    try:
      print(action_dict[mode](my_string))
    except KeyError:
      raise ValueError("Unrecognised mode")


for mode in PrintFlag:
    print_my_string("RaNdoM CAse StRING", mode)

这里您有一个

您是对的,虽然不是静态类型的语言,但枚举的好处在Python中没有那么强。许多API仍然使用字符串来处理这类事情,而且还可以。然而,我认为它仍然有好处,特别是从IDE支持(自动完成)和静态分析(代码linting)的角度来看。假设您有一个函数,它允许您使用不同的方法计算向量的范数。选项是
'Euclidean'
'Absolute'
'Manhattan'
'Euclidean'
'Absolute\u VALUE'
'TAXICAB'
还是仅仅是“
e
a
”和
'm'
?如果您有一个enum和一个足够好的IDE,您可能可以编写
NormType.
并按Ctrl+Space查看选项,而不必再次查看文档。如果你写错了,代码过滤器可能会让你知道。此外,如果您碰巧重命名了其中一个选项,那么应该更容易找到所有需要更改的位置

也就是说,我同意在某些情况下,这可能会使代码更加混乱。在您的示例中,这些选项可能足够简单,可以毫无问题地使用字符串。在任何情况下,枚举的好处在多个地方使用时都会变得更加重要,例如,在多个具有类似参数的函数中,您希望实现一致性,并希望避免代码中愚蠢的字符串键入。对于单个函数的单个参数,很难证明需要枚举