PrettyPrint с изменяемым отображением - PullRequest
1 голос
/ 12 января 2020

У меня был вложенный dict в моем проекте, который был напечатан через PrettyPrint (просто добавьте в него вложенный dict).

Но этот вложенный dict пришлось заменить вложенными объектами MutableMapping, потому что мне нужно было переписать некоторые MagicMethods. Но поскольку теперь это объект, он просто берет первый ключ и печатает, что значение является объектом my_dict.

Как мне теперь PrettyPrint получить такой объект MutableMapping с атрибутом dict?

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.

1 Ответ

1 голос
/ 12 января 2020

pprint просто форматирует строку, возвращаемую __repr__, и печатает ее. Добавьте следующий метод dunder в ваш класс.

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. Таким образом, вы должны добавить метод pprint для вашего класса. В этом случае я сопоставил my_dict.__repr__ с методом pprint для dict, поэтому pprint форматирует my_dict объекты, как если бы они были диктовками.

pprint исходный код находится в простом python здесь .

...