【问题标题】:How to override __repr__ when inheriting from OrderedDict?从 OrderedDict 继承时如何覆盖 __repr__?
【发布时间】:2017-05-27 18:21:03
【问题描述】:

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

【问题讨论】:

  • 我无法重现您的结果。
  • 我无法在 python 2.7 中重现 - 你在哪个版本?
  • 这个问题好像只出现在IPython中。
  • IPython shell 对我来说是如此永久的工具。我什至不明白 - 问题的根源在哪里。谢谢。

标签: python inheritance ordereddictionary


【解决方案1】:

IPython 有一些“魔法”,它使用自己的漂亮打印机而不是默认的__repr__。您可以使用%pprint off 将其关闭,然后您的__repr__ 将起作用。您也可以尝试覆盖_repr_pretty,如here 所述。您的代码在 IPython 之外已经可以正常工作。

【讨论】:

    【解决方案2】:

    您的__repr__ 很好,但是 IPython 的漂亮打印机正在覆盖它。您可以显式打印repr:

    print repr(your_object)
    

    或禁用 IPython 的漂亮打印:

    # Toggles pretty-printing.
    %pprint
    

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      相关资源
      最近更新 更多