Python 3.x 在实现类时与使用Python枚举混淆

Python 3.x 在实现类时与使用Python枚举混淆,python-3.x,enums,Python 3.x,Enums,这是我第一次使用Enum,如果您能对下面的代码提供帮助,我将不胜感激。根据我的理解,当您使用一组值/名称定义枚举类时,该特定枚举类型的任何字段/变量都不能具有不在枚举类中的值/名称 假设我必须创建一个过敏类,它有一个“严重性”字段,可以有“低、中、高”的值,我必须使用enum来表示它。我认为,如果在创建对象时输入的“严重性”值不是低、中或高,则程序将引发错误。这是正确的还是应该在设置/初始化“严重性”之前显式检查输入是否存在于enum类中?如果我们必须显式检查,那么使用Enum的目的是什么 f

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

假设我必须创建一个过敏类,它有一个“严重性”字段,可以有“低、中、高”的值,我必须使用enum来表示它。我认为,如果在创建对象时输入的“严重性”值不是低、中或高,则程序将引发错误。这是正确的还是应该在设置/初始化“严重性”之前显式检查输入是否存在于enum类中?如果我们必须显式检查,那么使用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类中的名称,而不是如何在其他类中使用它


谢谢

有几件事,正如blhsing在他的评论中提到的,在python中不会自动强制使用类型提示。其次,如果您从未使用在代码中创建的严重性枚举来检查有效性,则可以将初始化更改为-

class Allergy:
    def __init__(self, name, symptoms, reporter, severity:Severity):
        self.__name = name
        self.__reporter = reporter        
        self.__symptoms = symptoms
        self.__severity = Severity[severity]
现在,它尝试使用提供的名称保存枚举的相应严重性。在枚举中不存在名称的情况下,它将抛出一个NameError,正如您先前所期望的那样


*注意,您需要以类似的方式更改set_severity函数,并且Python中不强制执行类型提示。要强制执行类型提示,您可以使用运行脚本,或使用类型提示强制执行器模块,例如。关闭
.name
部分,并按原样保存
Enum
成员。您仍然可以得到保护,确保它是一个
Enum
,具有
Severity[Severity]
部分,并且还保留了
Enum
的优点。