如果你要付出所有的努力,那么最好是将pprint
超类化以接受钩子,这样你只需要编写所有代码一次。
在你用pp = pprint.PrettyPrinter(indent=4).pprint
实例化pprint帮助程序之后定义类的情况下,它也可以更好地工作(这是我的一个坏习惯)。
然后,您可以通过使用以下任何一种方法中的任何一种来选择加入任何类[双关语不是故意的]
[编辑]:经过一些自我使用,我意识到有一个更简单的替代解决方案,即__pprint_repr__
。而不是尝试创建自己的pprint函数,只需定义__pprint_repr__
方法并返回标准python对象即可。如果您有一个复杂的类,可以在dict
中组合多个对象。
[编辑#2]:我还意识到将所有_format变量传递给__pprint_repr__
函数非常有用,因为这允许您做一些真正酷的事情--例如,如果您的项目在列表中(缩进> 0),则显示紧凑输出与完整输出(缩进== 0)。
这也意味着该解决方案与Python 2.7兼容,而不仅仅是Python ~> 3.3
class my_object(object):
def __pprint_repr__(self, **kwargs):
return self.__dict__
def __pprint_repr__(self, **kwargs):
_indent = kwargs['indent']
if _indent:
return self._toText()
return { self._toText(): self.__dict__ }
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)
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)
pprint(config)
只会输出<lib.ExtendedConfigParser.ExtendedConfigParser object at 0x0000000003569940>
。内部数据结构是两个嵌套的有序字典。我想将它们打印为2个嵌套的字典。我可以编写一个函数来完成这项工作,但我希望有一种方法和/或pprint兼容的类。 - Paebbelspprint
提供了那个功能。不过,你可以给你的类添加一个__format__
方法(除了__repr__
和__str__
方法之外),使它在传递给format
内置函数或str.format
方法时打印得更漂亮。 - PM 2Ring