【Python】修改枚举的取值及链式调用

文章介绍了如何在Python中实现枚举的值直接通过枚举名访问,以及如何进行多级链式调用。通过自定义元类`EnumDirectValueMeta`,使得可以直接使用`enum.key`获取值,而无需`enum.key.value`。此外,还展示了枚举在表示网络状态等场景中的应用,如`DeviceStatus`,支持通过`.code`和`.msg`进行访问。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值