我试图在交互式 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

最佳答案

IPython 有一些“魔法”,它使用自己的 pretty-print 而不是默认的 __repr__ 。您可以使用 %pprint off 将其关闭,然后您的 __repr__ 将起作用。您也可以按照 here 的描述尝试覆盖 _repr_pretty 。您的代码在 IPython 之外已经可以正常工作了。

关于python - 从 OrderedDict 继承时如何覆盖 __repr__?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44220262/

10-13 09:15
查看更多