如何获取python-measurement中MeasureBase的原始输入值与单位
原生python-measurement库没有内置方法可以直接获取初始化时传入的原始单位和原始值。
这个库的设计逻辑就是,实例化度量对象时会把所有传入的不同单位的数值,全部换算成类预设的default_unit(默认基准单位)存在内部,初始化阶段传入的原始单位、原始输入值不会做持久化留存,对象生成后这部分信息就被丢弃了,不存在原生API能直接调取。
可行实现方案
1. 自定义混入类封装留存逻辑
写一个简单的混入类,在初始化方法执行前先捕获传入的单位参数和对应值,存为实例属性,业务里用的时候把混入类和对应度量类多继承即可,代码示例:
from measurement.base import MeasureBase from measurement.measures import Volume, Weight class SaveOriginMixin: def __init__(self, *args, **kwargs): # 适配业务常用的单单位传参场景 if kwargs: self.origin_unit = next(iter(kwargs.keys())) self.origin_input_val = kwargs[self.origin_unit] super().__init__(*args, **kwargs) @property def origin_value(self): # 就算没存原始输入值,靠留存的单位也能从基准值换算回对应单位的数值 return getattr(self, self.origin_unit) # 按需封装业务要用的度量类型 class MyVolume(SaveOriginMixin, Volume): pass class MyWeight(SaveOriginMixin, Weight): pass
测试效果:
>>> v = MyVolume(us_qt=1) >>> print(v) 0.001 cubic_meter >>> v.origin_unit 'us_qt' >>> v.origin_value 1.0
2. Django/ORM存储场景加冗余字段
对接数据库读写的场景更简单,不需要改度量类的实现:除了库提供的度量字段存基准值之外,额外加两个字段:
- 字符串类型字段存原始单位标识,比如
us_qt - 数值类型字段存原始输入值
写入数据的时候同步把原始单位、原始值写到这两个冗余字段里,读的时候直接取这两个字段的值就行,比改类实现的适配成本更低。
别尝试从数据库存的基准值反推原始单位,不同单位换算到基准值是多对一的关系,没有额外标记根本不可能准确判断当初输入的是什么单位。
内容的提问来源于stack exchange,提问作者chris Frisina
相关产品推荐
相关产品推荐

