【问题标题】:How to print an object in Python如何在 Python 中打印对象
【发布时间】:2016-02-17 06:05:47
【问题描述】:

当我打印 myobject 的 $dict 时,它返回:

{'string': u'abc', 'object': <DEMO.Detail object at 0xb5b691ac>}

我希望它返回 myobject 的字典,并且我的对象内的所有对象也都更改为字典:

{'string': u'abc', 'object': {'obj_string': u'xyz', 'obj_object': {...}}}

请帮忙,

谢谢

【问题讨论】:

  • myobject的$ dict是什么意思?

标签: python python-3.x python-2.7 object converters


【解决方案1】:

如果您是DEMO.Detail 的创建者,您可以添加__repr____str__ 方法:

class Detail:
    def __str__(self):
        return "string shown to users (on str and print)"
    def __repr__(self):
        return "string shown to developers (at REPL)"

这将使您的对象以这种方式运行:

>>> d = Detail()
>>> d
string shown to developers (at REPL)
>>> print(d)
string shown to users (on str and print)

在你的情况下,我假设你想在 __str__ 中调用 dict(self)

如果你不控制对象,你可以设置一个递归打印函数,检查对象是否为已知容器类型(listtupledictset)并递归调用迭代通过这些类型,根据需要打印所有自定义类型。

应该有一种方法可以用自定义PrettyPrinter 覆盖pprint。不过我从来没有这样做过。

最后,您还可以创建一个自定义 JSONEncoder 以了解您的自定义类型。除非您确实需要 JSON 格式,否则这不是一个好的解决方案。

【讨论】:

  • 我想我会设置一个递归打印函数来打印这个对象。谢谢。
【解决方案2】:

prettyprint 能做到吗?

>>> import pprint
>>> a = {'foo':{'bar':'yeah'}}
>>> pprint.pprint(a)
{'foo': {'bar': 'yeah'}}

如果您的对象实现了__repr__,它也可以打印那些。

import pprint
class Cheetah:
    def __repr__(self):
        return "chirp"

zoo = {'cage':{'animal':Cheetah()}}
pprint.pprint(zoo) 

# Output: {'cage': {'animal': chirp}}

【讨论】:

  • 我对自己的答案没有非常高的信心,可能有更好的解决方案。
  • 我只是想理解代码。不要抨击你的答案。它只是提供与print 相同的输出。可能是一个更好的例子来显示差异
  • @akrun 是的,我期待它的格式更好,但看起来和 print 一样。
  • @Bemmu 感谢您的帮助,但我无法更改“myobject”中的对象。我想把它和“myobject”一样打印出来而不用编辑它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
相关资源
最近更新 更多