Отформатируйте int как int, но передайте как% .3f - PullRequest
3 голосов
/ 19 сентября 2011

У меня есть функция, которая ожидает два значения отсечки, называемые min_df и max_df. Либо может быть int для обозначения абсолютной частоты среза, либо float для обозначения относительной частоты. Теперь я хочу добавить несколько проверок и дать соответствующие предупреждающие сообщения, но без лишних помех. Это работает:

if max_df < 0 or min_df < 0:
    raise ValueError, "neither max_df (%s) nor min_df (%s) may be <0" %
                      (max_df, min_df)

, но с float, таким как (1/3.), предупреждение содержит 0.333333333333. Я бы предпочел, чтобы он сказал 0.333, поэтому я попытался %.3f, но это также превращает значения int в числа с плавающей точкой и отображает 2.000 для 2.

Как включить тип, чтобы получить правильный формат? Нужно ли создавать строку форматирования перед передачей ее оператору %?

Обновление : мне нужно что-то, что работает в Python 2.5, так как это минимальная версия, на которую я нацеливаюсь.

Ответы [ 2 ]

8 голосов
/ 19 сентября 2011

Не усложняйте

def format_df(df):
    if isinstance(df, (int, long)):
        return "%d" % df
    elif isinstance(df, float):
        return "%.3f" % df
    else:
        return str(df) # fallback just in case

raise ValueError, "neither max_df (%s) nor min_df (%s) may be <0" %
                  (format_df(max_df), format_df(min_df))
6 голосов
/ 19 сентября 2011

Как насчет этого:

>>> "{:.4g}".format(1)
'1'
>>> "{:.4g}".format(1.3)
'1.3'
>>> "{:.4g}".format(1.333)
'1.333'
>>> "{:.4g}".format(1.333333)
'1.333'

Однако (поскольку 4 значащие цифры также включают целую часть), вы также получите это:

>>> "{:.4g}".format(10.333)
'10.33'
>>> "{:.4g}".format(10000)
'1e+04'
...