Skip to content

Instantly share code, notes, and snippets.

@danvk
Created October 6, 2014 20:52
Show Gist options
  • Save danvk/ca4c3fabe8331d32a94e to your computer and use it in GitHub Desktop.
Save danvk/ca4c3fabe8331d32a94e to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import sys
class IgnoreSubtree(Exception):
pass
def preorder_traversal(obj):
try:
yield obj
except IgnoreSubtree:
return
else:
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:
try:
iterator.throw(e)
except StopIteration:
pass
from nose.tools import *
def test_ignore_subtree():
obj = {'a': {'c': 3}, 'b': 2}
eq_([obj, {'c': 3}, 3, 2], list(preorder_traversal(obj)))
iterator = preorder_traversal(obj)
out = []
for o in iterator:
out.append(o)
if o == {'c': 3}:
try:
val = iterator.throw(IgnoreSubtree)
except StopIteration:
pass
else:
out.append(val)
eq_([obj, {'c': 3}, 2], out)
def test_ignore_subtree2():
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}:
try:
val = iterator.throw(IgnoreSubtree)
except StopIteration:
pass
else:
out.append(val)
eq_([obj, {'c': 3, 'd': 4}, 2], out)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment