首页 > 解决方案 > Python enum.Enum:创建我可以分配 enum.Enum 成员的变量

问题描述

在 Python 3.4+ 中创建枚举非常简单:

from enum import Enum

class MyEnum(Enum):
    A = 10
    B = 20

这给了我一个 typedef MyEnum。有了这个我可以分配一个变量:

x = MyEnum.A

到目前为止,一切都很好。但是,如果我喜欢使用 enum.Enum 作为函数或类方法的参数并希望确保类属性只包含 enum.Enum 成员而不包含其他值,事情就会变得复杂。

我怎样才能做到这一点?我的想法是这样的,我认为这更像是一种解决方法而不是解决方案:

class EnContainer:
    def __init__(self, val: type(MyEnum.A) = MyEnum.A):
        assert isinstance(val, type(MyEnum.A))
        self._value = val

你有什么建议或者你认为我的方法有什么问题吗?我必须考虑大约 10 种不同的枚举,并希望为初始化、setter 和 getter 找到一致的方法。

标签: python-3.xenumstype-safety

解决方案


而不是type(MyEnum.A),只需使用MyEnum

def __init__(self, val: MyEnum = MyEnum.A):
    assert isinstance(val, MyEnum)

永远不要assert用于错误检查,它们用于程序验证——换句话说,谁在调用EnContainer?如果只有您自己的代码使用已验证的数据调用它,那assert很好;但是如果您无法控制的代码正在调用它,那么您应该使用正确的错误检查:

def __init__(self, val: MyEnum = MyEnum.A):
    if not isinstance(val, MyEnum):
        raise ValueError(
                "EnContainer called with %s.%r (should be a 'MyEnum')"
                % (type(val), val)
                )

推荐阅读