#python #pint
#питон #пинта
Вопрос:
Допустим , у меня есть произвольное количество пинты q
. Есть ли способ отобразить его единицы измерения в краткой форме символа, а не в виде полноразмерного слова?
Другими словами, как бы я закодировал unit_symbol()
так, чтобы он возвращал «м», а не «метр»; «кг», а не «килограмм» и т.д.? Есть ли способ получить сокращенный символ единицы измерения, который является синонимом текущей единицы измерения количества?
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"
Приведенное выше, очевидно, не позволяет достичь этого; оно возвращает единицу длинной формы.
Ответ №1:
Вы можете использовать '~'
в качестве спецификации для форматирования единицы измерения:
q = Q_(42, "m") / Q_(1, "second")
print(format(q, '~')) # 42.0 m / s
print(format(q.u, '~')) # m / s
Эта функция, по-видимому, недокументирована, но может быть выведена из исходного кода для Unit.__format__
(выполните поиск "~"
на этой странице, чтобы быстро перейти к соответствующему фрагменту кода).
Комментарии:
1. Это задокументировано здесь .
2. Да, похоже, он был добавлен недавно
Ответ №2:
Я нашел 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
Ответ №3:
Используйте ureg.default_format = '~'
, если вы хотите использовать краткие обозначения по умолчанию. Это также допустимые варианты для коротких блоков: ~L
(LaTeX), ~H
(HTML) и ~P
(Pretty print).