Я согласен с @Nelson в том, что наследование от float неудобно, но, возможно, решение, которое касается только функции __repr__
, может быть простительным. В итоге я использовал пакет decimal
для этого, чтобы при необходимости переформатировать поплавки. Плюс в том, что это работает во всех контекстах, где вызывается repr()
, а также при простой печати списков в стандартный вывод. Кроме того, точность настраивается во время выполнения после создания данных. Недостатком, конечно, является то, что ваши данные должны быть преобразованы в этот специальный класс с плавающей точкой (поскольку, к сожалению, вы не можете показывать обезьяну патч float.__repr__
). Для этого я предоставляю краткую функцию преобразования.
Код:
import decimal
C = decimal.getcontext()
class decimal_formatted_float(float):
def __repr__(self):
s = str(C.create_decimal_from_float(self))
if '.' in s: s = s.rstrip('0')
return s
def convert_to_dff(elem):
try:
return elem.__class__(map(convert_to_dff, elem))
except:
if isinstance(elem, float):
return decimal_formatted_float(elem)
else:
return elem
Пример использования:
>>> import json
>>> li = [(1.2345,),(7.890123,4.567,890,890.)]
>>>
>>> decimal.getcontext().prec = 15
>>> dff_li = convert_to_dff(li)
>>> dff_li
[(1.2345,), (7.890123, 4.567, 890, 890)]
>>> json.dumps(dff_li)
'[[1.2345], [7.890123, 4.567, 890, 890]]'
>>>
>>> decimal.getcontext().prec = 3
>>> dff_li = convert_to_dff(li)
>>> dff_li
[(1.23,), (7.89, 4.57, 890, 890)]
>>> json.dumps(dff_li)
'[[1.23], [7.89, 4.57, 890, 890]]'