Skip to content

Commit f7ee7b2

Browse files
committed
add trace prints to remap
1 parent cf47ce3 commit f7ee7b2

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

boltons/iterutils.py

+29
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,9 @@ def remap(root, visit=default_visit, enter=default_enter, exit=default_exit,
11341134
callable. When set to ``False``, remap ignores any errors
11351135
raised by the *visit* callback. Items causing exceptions
11361136
are kept. See examples for more details.
1137+
trace (bool): Pass ``trace=True`` to print out the entire
1138+
traversal. Or pass a tuple of ``'visit'``, ``'enter'``,
1139+
or ``'exit'`` to print only the selected events.
11371140
11381141
remap is designed to cover the majority of cases with just the
11391142
*visit* callable. While passing in multiple callables is very
@@ -1162,6 +1165,15 @@ def remap(root, visit=default_visit, enter=default_enter, exit=default_exit,
11621165
if not callable(exit):
11631166
raise TypeError('exit expected callable, not: %r' % exit)
11641167
reraise_visit = kwargs.pop('reraise_visit', True)
1168+
trace = kwargs.pop('trace', ())
1169+
if trace is True:
1170+
trace = ('visit', 'enter', 'exit')
1171+
elif isinstance(trace, str):
1172+
trace = (trace,)
1173+
if not isinstance(trace, (tuple, list, set)):
1174+
raise TypeError('trace expected tuple of event names, not: %r' % trace)
1175+
trace_enter, trace_exit, trace_visit = 'enter' in trace, 'exit' in trace, 'visit' in trace
1176+
11651177
if kwargs:
11661178
raise TypeError('unexpected keyword arguments: %r' % kwargs.keys())
11671179

@@ -1174,14 +1186,23 @@ def remap(root, visit=default_visit, enter=default_enter, exit=default_exit,
11741186
key, new_parent, old_parent = value
11751187
id_value = id(old_parent)
11761188
path, new_items = new_items_stack.pop()
1189+
if trace_exit:
1190+
print(' .. remap exit:', path, '-', key, '-',
1191+
old_parent, '-', new_parent, '-', new_items)
11771192
value = exit(path, key, old_parent, new_parent, new_items)
1193+
if trace_exit:
1194+
print(' .. remap exit result:', value)
11781195
registry[id_value] = value
11791196
if not new_items_stack:
11801197
continue
11811198
elif id_value in registry:
11821199
value = registry[id_value]
11831200
else:
1201+
if trace_enter:
1202+
print(' .. remap enter:', path, '-', key, '-', value)
11841203
res = enter(path, key, value)
1204+
if trace_enter:
1205+
print(' .. remap enter result:', res)
11851206
try:
11861207
new_parent, new_items = res
11871208
except TypeError:
@@ -1197,21 +1218,29 @@ def remap(root, visit=default_visit, enter=default_enter, exit=default_exit,
11971218
stack.append((_REMAP_EXIT, (key, new_parent, value)))
11981219
if new_items:
11991220
stack.extend(reversed(list(new_items)))
1221+
if trace_enter:
1222+
print(' .. remap stack size now:', len(stack))
12001223
continue
12011224
if visit is _orig_default_visit:
12021225
# avoid function call overhead by inlining identity operation
12031226
visited_item = (key, value)
12041227
else:
12051228
try:
1229+
if trace_visit:
1230+
print(' .. remap visit:', path, '-', key, '-', value)
12061231
visited_item = visit(path, key, value)
12071232
except Exception:
12081233
if reraise_visit:
12091234
raise
12101235
visited_item = True
12111236
if visited_item is False:
1237+
if trace_visit:
1238+
print(' .. remap visit result: <drop>')
12121239
continue # drop
12131240
elif visited_item is True:
12141241
visited_item = (key, value)
1242+
if trace_visit:
1243+
print(' .. remap visit result:', visited_item)
12151244
# TODO: typecheck?
12161245
# raise TypeError('expected (key, value) from visit(),'
12171246
# ' not: %r' % visited_item)

0 commit comments

Comments
 (0)