如果您要全力以赴,不妨将pprint 超类化来接受一个钩子,那么您只需编写所有代码一次。
在你用pp = pprint.PrettyPrinter(indent=4).pprint(我的一个坏习惯)实例化一个 pprint 助手之后定义你的类的情况下,它也会更好地工作。
然后,您可以使用其中一种方法选择加入任何课程 [双关语不是有意的]
[edit]:经过一些自用,我意识到了一个更简单的替代解决方案,
__pprint_repr__。而不是尝试创建自己的 pprint 函数,
只需定义__pprint_repr__ 方法并返回一个标准的python 对象。
如果您有一个复杂的类,您可以将多个对象分组到 dict 中。
[edit #2]:我还意识到将所有 _format 变量传递给 __pprint_repr__ 函数会很有用,因为这可以让你做一些非常酷的事情——比如显示一个压缩的如果您的项目在列表中(缩进 > 0),则输出;如果它是唯一的对象,则输出完整(缩进 == 0)
这也意味着这个解决方案兼容 Python 2.7,而不仅仅是 Python ~> 3.3
class my_object(object):
# produce pprint compatible object, easy as pie!
def __pprint_repr__(self, **kwargs):
return self.__dict__
# make a multi-level object, easy as cheese-cake!
def __pprint_repr__(self, **kwargs):
_indent = kwargs['indent']
if _indent:
return self._toText()
return { self._toText(): self.__dict__ }
# to take total control (python 3) (requires __repr__ be defined)
def __pprint__(self, object, stream, indent, allowance, context, level):
stream.write('my_object(\n')
self._format(object._data, stream, indent, allowance + 1, context, level)
stream.write(')')
pass
子类本身很简单——在 Python 3.7 和 2.7 中测试:
if _pprint_repr:
return PrettyPrinter._format(self, _pprint_repr(object, stream=stream,
indent=indent, allowance=allowance, context=context, level=level),
stream, indent, allowance, context, level)
# else check for alternate _pprint method (if supported ~ python 3.3)
if getattr(PrettyPrinter, '_dispatch', None):
_repr = type(object).__repr__
_pprint = getattr(type(object), '__pprint__', None)
_exists = self._dispatch.get(_repr, None)
if not _exists and _pprint:
self._dispatch[_repr] = _pprint
return PrettyPrinter._format(self, object, stream, indent, allowance, context, level)