4

假设我有任意品脱数量q。有没有办法以符号短格式显示其单位,而不是作为全长单词?

换句话说,我将如何编码unit_symbol()以使其返回“m”,而不是“meter”;“公斤”不是“公斤”;ETC。?有没有办法检索与数量的当前单位同义的短格式单位符号?

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"

以上显然无法实现这一点;它返回长格式单元。

4

3 回答 3

4

您可以将'~'其用作单位格式的规范:

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

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

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

于 2021-01-12T10:51:30.563 回答
1

我发现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
于 2021-01-12T10:07:57.763 回答
0

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

于 2022-01-07T18:17:06.687 回答