默认情况下,打印defaultdict是否应该是丑陋的(非人类可读的)?

时间:2016-09-01 13:28:03

标签: python

打印dictdefaultdict

>>> d = {'key': 'value'}
>>> print(d)
{'key': 'value'}

>>> dd = defaultdict(lambda: 'value')
>>> dd['key']
'value'
>>> print(dd)
defaultdict(<function <lambda> at 0x7fbd44cb6b70>, {'key': 'value'})

使用嵌套结构会变得丑陋:

>>> nested_d = {'key1': {'key2': {'key3': 'value'}}}
>>> print(nested_d)
{'key1': {'key2': {'key3': 'value'}}}

>>> def factory():
...     return defaultdict(factory)
... 
>>> nested_dd = defaultdict(factory)
>>> nested_dd['key1']['key2']['key3'] = 'value'
>>> print(nested_dd)
defaultdict(<function factory at 0x7fbd44cd4ea0>, {'key1': defaultdict(<function factory at 0x7fbd44cd4ea0>, {'key2': defaultdict(<function factory at 0x7fbd44cd4ea0>, {'key3': 'value'})})})

默认情况下是否有任何理由不使其成为人类可读的? (UPD:我的意思是默认情况下没有为__str__定义自定义defaultdict的原因是什么?)

2 个答案:

答案 0 :(得分:1)

list = list.filter(function (x, i, a) { return a.indexOf(x) == i; }); 输出(repr()没有defaultdict,只有__str__调试输出。它并不意味着漂亮,它意味着功能。它告诉您类型,产生默认值的callable的__repr__和内容。

来自__repr__ documentation

  

这通常用于调试,因此表示信息丰富且明确无误。

与Python中的所有数据类型一样(由于显而易见的原因除了字符串),没有定义非正式的(repr()),因为程序员需要决定哪种输出适合他们的用例。没有默认值可以设置,因为用例变化如此广泛。例如,文件的输出与输出到GUI或网页的需求不同。

在Python 2中,首先将对象转换为普通字典,然后使用__str__,如果你想要的话,那就是&#39;漂亮&#39;输出:

pprint()

在Python 3中,def todict(d): if not isinstance(d, dict): return d return {k: todict(v) for k, v in d.items()} pprint(todict(nested_dd)) 直接支持pprint

defaultdict

答案 1 :(得分:1)

没有办法知道作者是在思考什么,甚至不知道他们是否给予了很多考虑。

对于嵌套defaultdict的特定情况,如示例代码所示:

def factory():
    return defaultdict(factory)
nested_dd = defaultdict(factory)
nested_dd['key1']['key2']['key3'] = 'value'

您可以通过以下方式对dict进行子类化来避免此问题:

class Tree(dict):
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

nested_dd = Tree()
nested_dd['key1']['key2']['key3'] = 'value'
print(nested_dd) # -> {'key1': {'key2': {'key3': 'value'}}}

由于子类没有定义自己的__repr__()__str__()方法,因此print(和pprint}的实例就像常规dict一样实例。