将 Pint 单位格式化为 short-form 符号

Format Pint unit as short-form symbol

假设我有任意 Pint 个数量 q。有没有办法以符号缩写形式显示其单位,而不是 full-length 单词?

换句话说,我如何编码 unit_symbol() 使其 returns 是“m”,而不是“meter”; “公斤”不是“千克”; ETC。?有没有办法检索与数量的当前单位同义的 short-form 单位符号?

import pint 
ureg = pint.UnitRegistry()
Q_ = ureg.Quantity

def unit_symbol(q: pint.Quantity) -> str:
    # Intended to return "m", not "meter"
    # "kg" not "kilogram"
    # etc.
    # ???
    return q.units  # returns long-form unit, "meter", "kilogram" etc. :-(
    
q = Q_(42, ureg.m)
print(unit_symbol(q))  # "meter"... whereas I would like "m"

上面显然没有达到这个目的;它 returns long-form 单位。

我找到了 UnitRegistry.get_symbol(),

ureg.get_symbol(str(q.units))  # "m"

但它似乎有点笨拙:将单位转换为字符串,然后再次解析该字符串...

这对于复合单位也是失败的,例如

q = Q_(42, "m") / Q_(1, "second")
ureg.get_symbol(str(q.units))  
# UndefinedUnitError: 'meter / second' is not defined in the unit registry

您可以使用 '~' 作为单位格式的规范:

q = Q_(42, "m") / Q_(1, "second")

print(format(q, '~'))  # 42.0 m / s
print(format(q.u, '~'))  # m / s

此功能显然没有记录,但可以从 source code for Unit.__format__ 中推断出来(在该页面上搜索 "~" 以快速导航到相关代码段)。

如果您希望默认使用短符号,请使用 ureg.default_format = '~'。这些也是短单元的有效选项:~L (LaTeX)、~H (HTML) 和 ~P (Pretty print)。