Форматирование единицы пинты как символа краткой формы

#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).