Python更改repr浮动数字

时间:2014-06-12 14:59:46

标签: python repr

好的,我想用repr()打印出一堆列表和嵌套数组的文本版本。

但我希望数字只有4位小数:42.7635745114但是32.7635。

我想使用repr(),因为它具有处理嵌套数组的良好能力。编写我自己的打印循环是一个没有吸引力的选择。

当然有一些方法可以让repr重做这个吗?我看到有一个repr和reprlib模块,但实例非常稀缺,就像不存在一样。

2 个答案:

答案 0 :(得分:4)

不,没有办法超载repr()。浮点数的格式在C源代码中是硬编码的。

float_repr() function使用'r'格式化程序调用辅助函数,最终调用utility function that hardcodes the format来归结为format(float, '.16g')

你可以继承float,但只是为了表示值(特别是在更大的结构中)这样做是过度的。这是repr(Python 3中的reprlib)的来源;该库旨在打印任意数据结构的有用表示,并允许您挂钩打印该结构中的特定类型。

您可以通过继承repr.Repr()来使用repr模块,提供repr_float()方法来处理浮点数:

import repr

class FloatRepr(repr.Repr):
    def repr_float(self, value, level):
        return format(value, '.4f')

print FloatRepr().repr(object_to_represent)

演示:

>>> import random
>>> import repr
>>> class FloatRepr(repr.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*属性,以影响每个容器类型打印的值数。

答案 1 :(得分:0)

也许您可以使用return "%.4f" %(self.float)尝试字符串格式:

>>> class obj:
...     def __init__(self, value):
...             self.float = value
...     def __repr__(self):
...             return "%.4f" %(self.float)
... 
>>> x = obj(8.1231231253252)
>>> x.float
8.1231231253252
>>> x
8.1231
>>>