Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 533e8c3

Browse files
committed
Add pprint support for containers from collections
for_type_by_name used to keep compatiblity with Python 2.4 rather than catching ImportError. deque is already imported, but uses same mechanism for consistency. Tests added for each type.
1 parent 814ba33 commit 533e8c3

2 files changed

Lines changed: 133 additions & 0 deletions

File tree

IPython/lib/pretty.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,51 @@ def for_type_by_name(type_module, type_name, func):
816816
NotImplemented]), _repr_pprint)
817817

818818

819+
def _defaultdict_pprint(obj, p, cycle):
820+
name = 'defaultdict'
821+
p.begin_group(len(name) + 1, name + '(')
822+
if cycle:
823+
p.text('...')
824+
else:
825+
p.pretty(obj.default_factory)
826+
p.text(',')
827+
p.breakable()
828+
p.pretty(dict(obj))
829+
p.end_group(len(name) + 1, ')')
830+
831+
def _ordereddict_pprint(obj, p, cycle):
832+
name = 'OrderedDict'
833+
p.begin_group(len(name) + 1, name + '(')
834+
if cycle:
835+
p.text('...')
836+
elif len(obj):
837+
p.pretty(list(obj.items()))
838+
p.end_group(len(name) + 1, ')')
839+
840+
def _deque_pprint(obj, p, cycle):
841+
name = 'deque'
842+
p.begin_group(len(name) + 1, name + '(')
843+
if cycle:
844+
p.text('...')
845+
else:
846+
p.pretty(list(obj))
847+
p.end_group(len(name) + 1, ')')
848+
849+
850+
def _counter_pprint(obj, p, cycle):
851+
name = 'Counter'
852+
p.begin_group(len(name) + 1, name + '(')
853+
if cycle:
854+
p.text('...')
855+
elif len(obj):
856+
p.pretty(dict(obj))
857+
p.end_group(len(name) + 1, ')')
858+
859+
for_type_by_name('collections', 'defaultdict', _defaultdict_pprint)
860+
for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint)
861+
for_type_by_name('collections', 'deque', _deque_pprint)
862+
for_type_by_name('collections', 'Counter', _counter_pprint)
863+
819864
if __name__ == '__main__':
820865
from random import randrange
821866
class Foo(object):

IPython/lib/tests/test_pretty.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
from __future__ import print_function
88

9+
from collections import Counter, defaultdict, deque, OrderedDict
10+
911
import nose.tools as nt
1012

1113
from IPython.lib import pretty
@@ -268,3 +270,89 @@ def type_pprint_wrapper(obj, p, cycle):
268270

269271
nt.assert_equal(output, '%s.MyObj' % __name__)
270272
nt.assert_true(type_pprint_wrapper.called)
273+
274+
275+
def test_collections_defaultdict():
276+
# Create defaultdicts with cycles
277+
a = defaultdict()
278+
a.default_factory = a
279+
b = defaultdict(list)
280+
b['key'] = b
281+
282+
# Dictionary order cannot be relied on, test against single keys.
283+
cases = [
284+
(defaultdict(list), 'defaultdict(list, {})'),
285+
(defaultdict(list, {'key': '-' * 50}),
286+
"defaultdict(list,\n"
287+
" {'key': '--------------------------------------------------'})"),
288+
(a, 'defaultdict(defaultdict(...), {})'),
289+
(b, "defaultdict(list, {'key': defaultdict(...)})"),
290+
]
291+
for obj, expected in cases:
292+
nt.assert_equal(pretty.pretty(obj), expected)
293+
294+
295+
def test_collections_ordereddict():
296+
# Create OrderedDict with cycle
297+
a = OrderedDict()
298+
a['key'] = a
299+
300+
cases = [
301+
(OrderedDict(), 'OrderedDict()'),
302+
(OrderedDict((i, i) for i in range(1000, 1010)),
303+
'OrderedDict([(1000, 1000),\n'
304+
' (1001, 1001),\n'
305+
' (1002, 1002),\n'
306+
' (1003, 1003),\n'
307+
' (1004, 1004),\n'
308+
' (1005, 1005),\n'
309+
' (1006, 1006),\n'
310+
' (1007, 1007),\n'
311+
' (1008, 1008),\n'
312+
' (1009, 1009)])'),
313+
(a, "OrderedDict([('key', OrderedDict(...))])"),
314+
]
315+
for obj, expected in cases:
316+
nt.assert_equal(pretty.pretty(obj), expected)
317+
318+
319+
def test_collections_deque():
320+
# Create deque with cycle
321+
a = deque()
322+
a.append(a)
323+
324+
cases = [
325+
(deque(), 'deque([])'),
326+
(deque(i for i in range(1000, 1020)),
327+
'deque([1000,\n'
328+
' 1001,\n'
329+
' 1002,\n'
330+
' 1003,\n'
331+
' 1004,\n'
332+
' 1005,\n'
333+
' 1006,\n'
334+
' 1007,\n'
335+
' 1008,\n'
336+
' 1009,\n'
337+
' 1010,\n'
338+
' 1011,\n'
339+
' 1012,\n'
340+
' 1013,\n'
341+
' 1014,\n'
342+
' 1015,\n'
343+
' 1016,\n'
344+
' 1017,\n'
345+
' 1018,\n'
346+
' 1019])'),
347+
(a, 'deque([deque(...)])'),
348+
]
349+
for obj, expected in cases:
350+
nt.assert_equal(pretty.pretty(obj), expected)
351+
352+
def test_collections_counter():
353+
cases = [
354+
(Counter(), 'Counter()'),
355+
(Counter(a=1), "Counter({'a': 1})"),
356+
]
357+
for obj, expected in cases:
358+
nt.assert_equal(pretty.pretty(obj), expected)

0 commit comments

Comments
 (0)