Ось ще одна відповідь, яка працює шляхом перевизначення та внутрішнього використання функції запасів pprint(). На відміну від мого попереднього, він буде обробляти OrderedDictвсередині іншого контейнера, такого як a, listі також повинен мати можливість обробляти будь-які необов'язкові аргументи ключових слів, однак він не має такого рівня контролю над вихідними даними, який надав інший.
Він працює, перенаправляючи висновок функції запасів у тимчасовий буфер, а потім обертається словами, перш ніж відправляти його у вихідний потік. Хоча кінцевий результат не є надзвичайно гарним, він гідний і може бути "достатньо хорошим", щоб використати його як обхідний шлях.
Оновлення 2.0
Спрощено за допомогою стандартного бібліотечного textwrapмодуля та модифіковано для роботи в Python 2 і 3.
from collections import OrderedDict
try:
from cStringIO import StringIO
except ImportError: # Python 3
from io import StringIO
from pprint import pprint as pp_pprint
import sys
import textwrap
def pprint(object, **kwrds):
try:
width = kwrds['width']
except KeyError: # unlimited, use stock function
pp_pprint(object, **kwrds)
return
buffer = StringIO()
stream = kwrds.get('stream', sys.stdout)
kwrds.update({'stream': buffer})
pp_pprint(object, **kwrds)
words = buffer.getvalue().split()
buffer.close()
# word wrap output onto multiple lines <= width characters
try:
print >> stream, textwrap.fill(' '.join(words), width=width)
except TypeError: # Python 3
print(textwrap.fill(' '.join(words), width=width), file=stream)
d = dict((('john',1), ('paul',2), ('mary',3)))
od = OrderedDict((('john',1), ('paul',2), ('mary',3)))
lod = [OrderedDict((('john',1), ('paul',2), ('mary',3))),
OrderedDict((('moe',1), ('curly',2), ('larry',3))),
OrderedDict((('weapons',1), ('mass',2), ('destruction',3)))]
Вибірка зразка:
pprint(d, width=40)
» {'john': 1, 'mary': 3, 'paul': 2}
pprint(od, width=40)
» OrderedDict([('john', 1), ('paul', 2),
('mary', 3)])
pprint(lod, width=40)
» [OrderedDict([('john', 1), ('paul', 2),
('mary', 3)]), OrderedDict([('moe', 1),
('curly', 2), ('larry', 3)]),
OrderedDict([('weapons', 1), ('mass',
2), ('destruction', 3)])]