从OrderedDict继承时如何覆盖__repr__?
How to override __repr__ when inheriting from OrderedDict?
我正在尝试在交互式 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
但不能保证顺序。我不知道,为什么第一种方法不起作用?
编辑:
Python3.6.1
IPython6.0.0
您的 __repr__
没问题,但 IPython 的漂亮打印机覆盖了它。您可以显式打印 repr
:
print repr(your_object)
或禁用IPython的漂亮打印:
# Toggles pretty-printing.
%pprint
IPython 有一些 "magic" 使用自己的漂亮打印机而不是默认的 __repr__
。您可以使用 %pprint off
关闭此功能,然后您的 __repr__
将起作用。您也可以尝试覆盖 _repr_pretty
,如 here 所述。您的代码在 IPython 之外已经可以正常工作。
我正在尝试在交互式 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
但不能保证顺序。我不知道,为什么第一种方法不起作用?
编辑:
Python3.6.1
IPython6.0.0
您的 __repr__
没问题,但 IPython 的漂亮打印机覆盖了它。您可以显式打印 repr
:
print repr(your_object)
或禁用IPython的漂亮打印:
# Toggles pretty-printing.
%pprint
IPython 有一些 "magic" 使用自己的漂亮打印机而不是默认的 __repr__
。您可以使用 %pprint off
关闭此功能,然后您的 __repr__
将起作用。您也可以尝试覆盖 _repr_pretty
,如 here 所述。您的代码在 IPython 之外已经可以正常工作。