Как назначить переменную функции «форматирования»?

#python #string

Вопрос:

В python я могу создать следующую функцию:

 In [1]: num_formatter = '{:.4g}'.format
In [2]: num_formatter(1.234567)
Out[2]: '1.235'
 

Но сейчас я хочу чего-то вроде:

 In [1]: num_fig = 4
In [2]: num_formatter = '{:.{nf}g}'.format(nf=num_fig)
In [3]: num_formatter(1.234567)
Out[3]: '1.235'
 

Однако этот код выдает мне ошибку «Индекс замены 0 вне диапазона для кортежа позиционных аргументов». Что я понимаю, он спрашивает, что делать с вводом 1.234567, но я не знаю, как это исправить. Я попытался использовать *args или **kargs внутри формата, но это не работает. Как бы это было сделано?

Комментарии:

1. Превратить его в функцию или в лямбду?

2. Или используйте functools.partial .

Ответ №1:

Использование f строки

Экс:

 nf = 4
num_formatter = f'{{:.{nf}g}}'.format
print(num_formatter(1.234567)) # --> 1.235
 

Ответ №2:

Используйте лямбду:

 >>> num_formatter = lambda n,p: f'{n:.{p}g}'
>>> num_formatter(1.234567,4)
'1.235'
 

Другой вариант-создать настраиваемый класс, который является лучшим вариантом, чем глобальные переменные:

 >>> class Formatter:
...     def __init__(self,precision=None):
...         self.set_precision(2 if precision is None else precision)
...     def __call__(self,n):
...         return f'{n:.{self.p}g}'
...     def set_precision(self,p):
...         self.p = p
...         
>>> num_formatter = Formatter()
>>> num_formatter(1.23456)
'1.2'
>>> num_formatter.set_precision(4)
>>> num_formatter(1.23456)
'1.235'
>>> num_formatter = Formatter(3)
>>> num_formatter(1.23456)
'1.23'