author: jwensh
date: 2023.02.11
枚举的取值及链式调用
需求背景
测试过程中需要很多参数化的设置及编程规范要求,希望修改数据不修改代码。最近测试区块链的时候有很多这样的需求,所以这里搞一下
1. enum.key 即获取值(而不是 enum.key.value)
-
因为我不要知道 key 是什么,code review 的时候我看到 key 即可知道其作用
-
使用元类进行继承
from enum import Enum, unique, EnumMeta
class EnumDirectValueMeta(EnumMeta):
"""
可以解决调用枚举属性时,由类型 enum 变成 string
需要枚举类继承: Enum, metaclass=EnumDirectValueMeta
"""
def __getattribute__(cls, name):
value = super().__getattribute__(name)
if isinstance(value, cls):
value = value.value
return value
- 实际的枚举
@unique
class Conservator(Enum, metaclass=EnumDirectValueMeta):
ADDRESS_A = "0x0000000000000000000000000000000000000000"
PRIVATE_KEY_A = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
ADDRESS_B = "0x0000000000000000000000000000000000000001"
PRIVATE_KEY_B = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
if __name__ == '__main__':
print(Conservator.ADDRESS_A) # 0x0000000000000000000000000000000000000000
2. 多级链式调用
- 常用用于网络状态相关的定义
from enum import Enum
class DeviceStatus(Enum):
UNCONNECTED = (10008, "Check if your device is connected properly")
CURRT_PKG = (10001, "got mobile current running package name happened error")
def __init__(self, code, msg):
self.code = code
self.msg = msg
if __name__ == '__main__':
print(DeviceStatus.UNCONNECTED.code) #10008
print(DeviceStatus.UNCONNECTED.msg) #Check if your device is connected properly
print(DeviceStatus.CURRT_PKG.msg) # got mobile current running package name happened error
文章介绍了如何在Python中实现枚举的值直接通过枚举名访问,以及如何进行多级链式调用。通过自定义元类`EnumDirectValueMeta`,使得可以直接使用`enum.key`获取值,而无需`enum.key.value`。此外,还展示了枚举在表示网络状态等场景中的应用,如`DeviceStatus`,支持通过`.code`和`.msg`进行访问。
1514

被折叠的 条评论
为什么被折叠?



