如何将自定义DataTypes IntEnum映射到另一组整数?
如何将IntEnum映射到另一组整数
针对你现有的DataTypes IntEnum类,要把它的成员映射到另一组全新的整数值,有几种实用的实现方式,我给你逐一说明:
方法1:直接使用字典映射(最简单直观)
这是最直接的方式,定义一个字典把每个枚举成员和目标整数一一对应起来,使用时直接通过字典取值即可:
from enum import IntEnum class DataTypes(IntEnum): Bytei = 0 # RAM缓冲变量8位(开关量输入) Byteo = 1 # RAM缓冲变量8位(开关量输出) Bytem = 2 # RAM缓冲变量8位(标志位) Wordi = 3 # RAM系统变量16位(有符号整数) Wordo = 4 # RAM系统变量16位(有符号整数) Wordm = 5 # RAM缓冲变量16位(有符号整数) Wordp = 6 # E2PROM变量(参数)16位(有符号整数) Dworm = 7 # RAM缓冲变量32位(有符号长整数...) # 自定义映射关系,替换成你需要的目标整数值 data_type_to_new_int = { DataTypes.Bytei: 10, DataTypes.Byteo: 11, DataTypes.Bytem: 12, DataTypes.Wordi: 20, DataTypes.Wordo: 21, DataTypes.Wordm: 22, DataTypes.Wordp: 30, DataTypes.Dworm: 40 } # 调用示例 print(data_type_to_new_int[DataTypes.Bytei]) # 输出: 10
如果需要反向映射(从新整数转回原枚举成员),可以快速生成反向字典:
new_int_to_data_type = {v: k for k, v in data_type_to_new_int.items()} print(new_int_to_data_type[10]) # 输出: DataTypes.Bytei
方法2:给枚举类添加映射方法(更封装)
如果希望映射逻辑和枚举类绑定在一起,显得更整洁,可以给DataTypes添加一个实例方法,内部实现映射:
from enum import IntEnum class DataTypes(IntEnum): Bytei = 0 # RAM缓冲变量8位(开关量输入) Byteo = 1 # RAM缓冲变量8位(开关量输出) Bytem = 2 # RAM缓冲变量8位(标志位) Wordi = 3 # RAM系统变量16位(有符号整数) Wordo = 4 # RAM系统变量16位(有符号整数) Wordm = 5 # RAM缓冲变量16位(有符号整数) Wordp = 6 # E2PROM变量(参数)16位(有符号整数) Dworm = 7 # RAM缓冲变量32位(有符号长整数...) def to_new_integer(self): # 在这里定义映射关系 mapping = { DataTypes.Bytei: 10, DataTypes.Byteo: 11, DataTypes.Bytem: 12, DataTypes.Wordi: 20, DataTypes.Wordo: 21, DataTypes.Wordm: 22, DataTypes.Wordp: 30, DataTypes.Dworm: 40 } return mapping[self] # 调用示例 print(DataTypes.Byteo.to_new_integer()) # 输出: 11
方法3:基于规则计算(如果新值有规律)
如果你的目标整数和原枚举值存在固定的计算规则(比如原数值+10、乘2等),完全不需要字典,直接通过计算得到:
from enum import IntEnum class DataTypes(IntEnum): Bytei = 0 # RAM缓冲变量8位(开关量输入) Byteo = 1 # RAM缓冲变量8位(开关量输出) Bytem = 2 # RAM缓冲变量8位(标志位) Wordi = 3 # RAM系统变量16位(有符号整数) Wordo = 4 # RAM系统变量16位(有符号整数) Wordm = 5 # RAM缓冲变量16位(有符号整数) Wordp = 6 # E2PROM变量(参数)16位(有符号整数) Dworm = 7 # RAM缓冲变量32位(有符号长整数...) def to_new_integer(self): # 示例规则:原数值+10,根据你的实际规则修改 return self.value + 10 # 调用示例 print(DataTypes.Wordp.to_new_integer()) # 输出: 16
你可以根据自己的实际场景选择最合适的方式:如果映射是完全自定义无规律,用字典或枚举方法;如果有固定计算逻辑,直接用规则计算会更高效。
内容的提问来源于stack exchange,提问作者Kami Kaze
相关产品推荐
相关产品推荐

