Skip to content

Instantly share code, notes, and snippets.

@danvk
Created October 6, 2014 20:36
Show Gist options
  • Save danvk/925f6cc25df1c9583157 to your computer and use it in GitHub Desktop.
Save danvk/925f6cc25df1c9583157 to your computer and use it in GitHub Desktop.
class IgnoreSubtree(Exception):
pass
def preorder_traversal(obj):
try:
yield obj
except IgnoreSubtree:
return
if isinstance(obj, dict):
for k, v in obj.iteritems():
iterator = preorder_traversal(v)
for o in iterator:
try:
yield o
except IgnoreSubtree as e:
pass
from nose.tools import *
def test_ignore_subtree():
obj = {'a': {'c': 3, 'd': 4}, 'b': 2}
eq_([obj, {'c': 3, 'd': 4}, 3, 4, 2],
list(preorder_traversal(obj)))
iterator = preorder_traversal(obj)
out = []
for o in iterator:
out.append(o)
if o == {'c': 3, 'd': 4}:
iterator.throw(IgnoreSubtree)
eq_([obj, {'c': 3, 'd': 4}, 2], out)
# Expected vs. actual:
# [{'a': {'c': 3, 'd': 4}, 'b': 2}, {'c': 3, 'd': 4}, 2]
# [{'a': {'c': 3, 'd': 4}, 'b': 2}, {'c': 3, 'd': 4}, 4, 2]
@danvk
Copy link
Author

danvk commented Oct 6, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment