我正在尝试使用交互式shell(在我的案例中为IPython
)时从分析中实现漂亮的结果。这是某种映射,顺序对我来说也很重要,所以我尝试从OrderedDict
继承并覆盖__repr__
方法,但这种方法不起作用。最低测试示例:
In[1]: from collections import OrderedDict
In[2]: class Result(OrderedDict):
def __repr__(self):
if self.keys():
report = []
for k, v in self.items():
report.append(k.ljust(10) + ': ' + repr(v))
return "\n".join(report)
else:
return self.__class__.__name__ + "()"
In[3]: res = Result()
res['all'] = 10
res['some'] = 11
res
Out[3]: Result([('all', 10), ('some', 11)])
但是当我从dict
(class Result(dict):
)继承时,这种方法按预期工作,结果如下:
Out[3]: all : 10
some : 11
但订单无法保证。我不知道为什么第一种方法不起作用?
修改
Python 3.6.1
IPython 6.0.0
答案 0 :(得分:7)
IPython有一些“神奇”,它使用自己的漂亮打印机而不是默认的__repr__
。您可以使用%pprint off
关闭此功能,然后__repr__
即可使用。您还可以尝试按照here所述覆盖_repr_pretty
。您的代码在IPython之外已经正常工作。
答案 1 :(得分:2)
你的__repr__
很好,但是IPython的漂亮打印机正在覆盖它。您可以明确打印repr
:
print repr(your_object)
或禁用IPython的漂亮打印:
# Toggles pretty-printing.
%pprint