Нет, перегрузить repr()
невозможно. Формат чисел с плавающей запятой жестко запрограммирован в исходном коде C.
float_repr()
функция вызывает вспомогательную функцию с 'r'
formatter, который в конечном итоге вызывает служебную функцию, жестко кодирующую формат к тому, что сводится к format(float, '.16g')
.
Вы можете подклассировать float
, но делать это только для представления значений (особенно в более крупной структуре) - это излишество. Именно здесь появляется repr
(reprlib
в Python 3); эта библиотека предназначена для печати полезных представлений произвольных структур данных и позволяет вам подключаться к печати определенных типов в этой структуре.
Вы можете использовать модуль repr
, создав подкласс repr.Repr()
, предоставляя repr_float()
метод для обработки поплавков:
try: # Python 3
import reprlib
except ImportError: # Python 2
import repr as reprlib
class FloatRepr(reprlib.Repr):
def repr_float(self, value, level):
return format(value, '.4f')
print(FloatRepr().repr(object_to_represent))
Демо:
>>> import random
>>> import reprlib
>>> class FloatRepr(reprlib.Repr):
... def repr_float(self, value, level):
... return format(value, '.4f')
...
>>> print(FloatRepr().repr([random.random() for _ in range(5)]))
[0.5613, 0.9042, 0.3891, 0.7396, 0.0140]
Вы можете установить атрибуты max*
в своем подклассе, чтобы влиять на количество печатаемых значений для каждого типа контейнера.
person
Martijn Pieters
schedule
12.06.2014
repr
следует использовать только, когда вам нужно точное строковое представление. Обычно верно, чтоeval(repr(x)) == x
.str
следует использовать для получения стандартного удобочитаемого представления. Если вам нужно настраиваемое форматирование, вы должны использовать операции форматирования (например,str.format
) и указать, как должен быть составлен вывод. - person Bakuriu   schedule 12.06.2014