python-3.x - 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 找到一致的方法。
解决方案
而不是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)
)
推荐阅读
- django - 如何显示年份和月份的两个日期差异?
- google-apps-script - 例外:尽管范围是从数据创建的,但数据中的列数与范围中的列数不匹配
- reactjs - React-Native Animated.interpolate 不适用于 Styled-Components
- huggingface-transformers - 拥抱脸总结
- sql - 如何在 Bigquery 存储过程中添加过滤器 sql `WHERE` CLAUSE?
- windows - 2个列表框选定项目gui
- regex - 如何使正则表达式区分大小写
- javascript - 显示缩放的内容
- python - 加速 Raspberry Pi 性能
- api - Drupal 8 - 将 Web 表单提交到外部 API