Ответ 1
Я использовал pprint(dict(defaultdict))
раньше в качестве рабочего процесса.
Я использую default dict. Мне нужно 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
для работы с дефолтом по умолчанию?
Я использовал pprint(dict(defaultdict))
раньше в качестве рабочего процесса.
Лучшее решение, которое я нашел, - это немного взломанный, но элегантный (если взломать когда-либо):
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
.
Если вам не нужно использовать pprint
, вы можете использовать json
для красивой печати defaultdict
:
print(json.dumps(my_default_dict, indent=4))
Это также работает для вложенных defaultdicts.
В том же духе, что и ответ Джона Клемента, если это обычная операция для вас, вы можете подумать о подклассе defaultdict, чтобы переопределить его метод повторения, как показано ниже.
Ввод:
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]]}
Мне действительно нравится это решение для работы с вложенными defaultdicts. Это немного взломать, но выполняет работу аккуратно, когда pdbing:
import json
data_as_dict = json.loads(json.dumps(data_as_defaultdict))
print(data_as_dict)