好的,我想使用 repr() 打印出一堆列表和嵌套数组的文本版本。
但我希望这些数字只有 4 位小数,而不是:42.7635745114 而是 32.7635。
我想使用 repr() 因为它有很好的处理嵌套数组的能力。编写我自己的打印循环是一个没有吸引力的选择。
当然有一些方法可以让 repr 超载来做到这一点?我看到有一个 repr 和 reprlib 模块,但例子真的很少,就像不存在一样。
不,没有办法超载repr()
。浮点数的格式在 C 源代码中是硬编码的。
该float_repr()
函数使用格式化程序调用一个辅助函数,该函数'r'
最终调用一个实用函数,将格式硬编码为format(float, '.16g')
.
您可以 subclass 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*
在子类上设置属性以影响每种容器类型打印的值的数量。
也许你可以尝试使用字符串格式化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
>>>