【问题标题】:Confused with using Python Enum while implementing a class在实现类时对使用 Python Enum 感到困惑
【发布时间】:2019-10-21 06:20:08
【问题描述】:

这是我第一次使用 Enum,希望对下面的代码提供任何帮助。根据我的理解,当您使用一组值/名称定义 Enum 类时,该特定 Enum 类型的任何字段/变量都不能具有不在 Enum 类中的值/名称。

假设我必须创建一个 Allergy 类,它有一个“严重性”字段,其值可以是“LOW、MEDIUM、HIGH”,我必须使用枚举来表示它。我认为如果在创建对象时输入“严重性”的值不是 LOW、MEDIUM 或 HIGH,程序会引发错误。这是正确的还是我应该在设置/初始化“严重性”之前明确检查输入是否存在于枚举类中?如果我们必须明确检查,那么使用 Enum 的目的是什么?


from enum import Enum,auto

class Severity(Enum):
    LOW = auto()
    MEDIUM = auto()
    HIGH = auto()

class Allergy:
    def __init__(self, name, symptoms, reporter, severity:Severity):
        self.__name = name
        self.__reporter = reporter        
        self.__symptoms = symptoms
        self.__severity = severity

     def get_severity(self):
        return self.__severity

     def set_severity(self, severity:Severity):
        self.__severity = severity

allergy = Allergy("Dust Allergy","sneezes","Doctor", "5")
print("How severe is the allergy? ",allergy.get_severity())


我期待代码引发错误或不运行,因为“5”不在 Enum 类中。但这是输出

How severe is the allergy?  5

我不确定我是否在这里遗漏了一些非常基本的东西,但网上的例子似乎都没有消除我的疑虑。 到目前为止,我看到的所有示例都显示了基本语法/如何直接访问 Enum 类中的名称,但没有显示如何在不同的类中使用它。

谢谢。

【问题讨论】:

  • Python 中不强制执行类型提示。要强制类型提示,您可以使用 mypy 运行脚本,或使用类型提示强制模块,例如 enforce

标签: python-3.x enums


【解决方案1】:

正如 blhsing 在他的评论中提到的那样,您对类型提示的使用在 python 中不会自动强制执行。其次,您永远不会使用您在代码中创建的 Severity Enum 来检查有效性,您可以将初始化更改为-

class Allergy:
    def __init__(self, name, symptoms, reporter, severity:Severity):
        self.__name = name
        self.__reporter = reporter        
        self.__symptoms = symptoms
        self.__severity = Severity[severity]

现在尝试使用提供的名称保存枚举的相应严重性。如果 Enum 中不存在该名称,它将如您之前所期望的那样抛出 NameError。

*请注意,您也需要以类似的方式更改 set_severity 函数

【讨论】:

  • 去掉.name 部分并按原样保存Enum 成员。您仍然可以确保它是带有Severity[severity] 部分的Enum,并且还保留了拥有Enum 的优势。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多