具有可变映射的 PrettyPrint

PrettyPrint with Mutable Mapping

我的项目中有一个嵌套字典,它是通过 PrettyPrint 打印的(只需将嵌套字典放入其中即可)。

但是这个嵌套的 dict 必须被嵌套的 MutableMapping 对象替换,因为我需要覆盖一些 MagicMethods。 但是因为它现在是一个对象,它只是获取第一个键并打印出来,该值是一个 my_dict 对象。

我现在如何 PrettyPrint 这样一个带有 dict 属性的 MutableMapping 对象?

class my_dict(collections.abc.MutableMapping):
    def __init__(self):
        print("dict was created")
        self.d = dict() # var where I want to store my key/values

    def __setitem__(self, key, value):
        # do sth else
        print("Dict Element was set: Key:\t{}, Value:\t{}".format(key, value))
        self.d[key] = value
        return

    def __getitem__(self, key):
        # do sth else
        print("Item was requested")
        return self.d[key]

    def __delitem__(self, key):
        del self.d[key]

    def __iter__(self):
        return self.d.__iter__()

    def __len__(self):
        return len(self.d)

    def sd(self, k, d):
        if k not in self:
            self[k] = d
        return self[k]

我正在使用 Python 3.6.

pprint只是格式化__repr__返回的字符串,然后打印出来。 将以下 dunder 方法添加到您的 class.

def __repr__(self):
    return self.d.__repr__()

已编辑

from pprint import PrettyPrinter
PrettyPrinter._dispatch[my_dict.__repr__] = PrettyPrinter._pprint_dict

pprint 将打印出来,就好像它是用内部 dict self.d 调用的一样。 PrettyPrinter 有一个名为 _dispatch 的内部字典,它映射 class.__repr__ => pprint_method。所以你必须为你的 class 添加一个 pprint 方法。在这种情况下,我将 my_dict.__repr__ 映射到 dict 的 pprint 方法,因此 pprintmy_dict 对象格式化为字典。

pprint 源代码是普通的 python here.