Skip to content

Instantly share code, notes, and snippets.

@danbradham
Last active February 21, 2018 21:39
Show Gist options
  • Save danbradham/956090efadedabc51363ee404e525f35 to your computer and use it in GitHub Desktop.
Save danbradham/956090efadedabc51363ee404e525f35 to your computer and use it in GitHub Desktop.
Python 2.7 Recursive Generator
def regenerator(generator_fn):
'''A decorator for generators. When a generator is yielded, it's
items are yielded one by one. This allows generators to be recursive
without requiring the yield from syntax of Python 3.3+.
Examples:
>>> @regenerator
... def count_down(number):
... if number < 0:
... return
... for i in range(number)[::-1]:
... yield i
... yield count_down(number - 1)
>>> list(count_down(3))
[2, 1, 0, 1, 0, 0]
'''
@wraps(generator_fn)
def flatten_generator(*args, **kwargs):
stack = [generator_fn(*args, **kwargs)]
while True:
try:
item = stack[-1].next()
except StopIteration:
stack.pop()
if not stack:
raise
else:
if inspect.isgenerator(item):
stack.append(item)
else:
yield item
return flatten_generator
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment