Python和默认dict,如何pprint

时间:2012-10-16 23:36:47

标签: python

我正在使用默认字典。我需要pprint

然而,当我pprint时......这就是它的样子。

defaultdict(<functools.partial object at 0x1f68418>, {u'300:250': defaultdict(<functools.partial object at 0x1f683c0>, {0: defaultdict(<type 'list'>, {u'agid1430864021': {u'status': u'0', u'exclude_regi..........

如何让pprint使用默认字典?

5 个答案:

答案 0 :(得分:35)

我之前使用pprint(dict(defaultdict))作为解决方法。

答案 1 :(得分:19)

我发现的最好的解决方案是一个黑客,但是一个优雅的解决方案(如果一个黑客可以):

class PrettyDefaultDict(collections.defaultdict):
    __repr__ = dict.__repr__

然后使用PrettyDefaultDict类而不是collections.defaultdict。它的工作原理是因为pprint模块的工作方式(至少在2.7上):

r = getattr(typ, "__repr__", None)
if issubclass(typ, dict) and r is dict.__repr__:
    # follows pprint dict formatting

通过这种方式,我们“欺骗”pprint,认为我们的字典类就像普通dict一样。

答案 2 :(得分:10)

如果您不必使用pprint,则可以使用json来打印defaultdict

print(json.dumps(my_default_dict, indent=4))

这也适用于嵌套的默认值。

答案 3 :(得分:4)

与Jon Clements的回答一样,如果这是您的常用操作,您可以考虑将defaultdict子类化为覆盖其repr方法,如下所示。

<强>输入:

from collections import defaultdict

class prettyDict(defaultdict):
    def __init__(self, *args, **kwargs):
        defaultdict.__init__(self,*args,**kwargs)

    def __repr__(self):
        return str(dict(self))

foo = prettyDict(list)

foo['bar'].append([1,2,3])
foo['foobar'].append([4,5,6,7,8])

print(foo)

<强>输出:

{'foobar': [[4, 5, 6, 7, 8]], 'bar': [[1, 2, 3]]}

答案 4 :(得分:3)

我真的很喜欢这个解决嵌套默认设置的解决方案。这有点像黑客攻击,但在pdbing时整齐地完成工作:

import json
data_as_dict = json.loads(json.dumps(data_as_defaultdict))
print(data_as_dict)

来自:https://stackoverflow.com/a/32303615/4526633