在pint中如何针对单个单位/维度设置默认字符串格式化规则
问题解答
Pint库目前没有原生支持按单个单位或维度配置独立默认格式化规则的功能。你尝试直接为Unit对象设置default_format的方式无法生效,是因为Unit实例的default_format属性默认继承自全局UnitRegistry的配置,单独赋值不会被持久化,也不会传递给对应单位生成的Quantity实例。
实现方案
通过自定义继承UnitRegistry的子类,在生成Quantity实例时自动匹配预设的格式化规则即可实现需求,以下是两种常用场景的实现:
按单个单位配置格式
from pint import UnitRegistry class CustomUnitRegistry(UnitRegistry): # 单位-格式映射表,可按需扩展 unit_format_mapping = { "km": ".2fP", "eur": ".2f", # 价格单位示例 } def __call__(self, value, units=None, **kwargs): quantity = super().__call__(value, units=units, **kwargs) unit_key = str(quantity.units) if unit_key in self.unit_format_mapping: quantity.default_format = self.unit_format_mapping[unit_key] return quantity # 初始化自定义注册表 ureg = CustomUnitRegistry() ureg.default_format = ".0f~" # 全局默认格式 # 测试效果 dist = 3 * ureg("km") time = 500 * ureg("s") print(f"{dist}, {time}") # 输出:3.00 kilometer, 500 s
按物理维度配置格式
如果需要给同一维度的所有单位设置统一格式(比如所有长度单位都保留2位小数),可以改用维度匹配逻辑:
from pint import UnitRegistry class CustomDimUnitRegistry(UnitRegistry): # 维度-格式映射表,可按需扩展 dim_format_mapping = { "[length]": ".2fP", "[currency]": ".2f", } def __call__(self, value, units=None, **kwargs): quantity = super().__call__(value, units=units, **kwargs) dim_key = str(quantity.dimensionality) if dim_key in self.dim_format_mapping: quantity.default_format = self.dim_format_mapping[dim_key] return quantity
该方案无需修改业务侧的物理量生成逻辑,所有通过自定义注册表生成的物理量都会自动匹配对应格式,完全满足同单位/同维度物理量自动应用对应格式化规则的需求。
内容的提问来源于stack exchange,提问作者ElRudi
相关产品推荐
相关产品推荐

