2

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

但我希望这些数字只有 4 位小数,而不是:42.7635745114 而是 32.7635。

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

当然有一些方法可以让 repr 超载来做到这一点?我看到有一个 repr 和 reprlib 模块,但例子真的很少,就像不存在一样。

4

2 回答 2

5

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

float_repr()函数使用格式化程序调用一个辅助函数,该函数'r'最终调用一个实用函数,将格式硬编码format(float, '.16g').

您可以 subclass float,但只为表示值(尤其是在更大的结构中)这样做是过分的。这就是reprreprlib在 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*在子类上设置属性以影响每种容器类型打印的值的数量。

于 2014-06-12T15:01:23.693 回答
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
>>> 
于 2014-06-12T15:08:25.557 回答