test_generator.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from greenlet import greenlet
  2. from . import TestCase
  3. class genlet(greenlet):
  4. parent = None
  5. def __init__(self, *args, **kwds):
  6. self.args = args
  7. self.kwds = kwds
  8. def run(self):
  9. fn, = self.fn
  10. fn(*self.args, **self.kwds)
  11. def __iter__(self):
  12. return self
  13. def __next__(self):
  14. self.parent = greenlet.getcurrent()
  15. result = self.switch()
  16. if self:
  17. return result
  18. raise StopIteration
  19. next = __next__
  20. def Yield(value):
  21. g = greenlet.getcurrent()
  22. while not isinstance(g, genlet):
  23. if g is None:
  24. raise RuntimeError('yield outside a genlet')
  25. g = g.parent
  26. g.parent.switch(value)
  27. def generator(func):
  28. class Generator(genlet):
  29. fn = (func,)
  30. return Generator
  31. # ____________________________________________________________
  32. class GeneratorTests(TestCase):
  33. def test_generator(self):
  34. seen = []
  35. def g(n):
  36. for i in range(n):
  37. seen.append(i)
  38. Yield(i)
  39. g = generator(g)
  40. for _ in range(3):
  41. for j in g(5):
  42. seen.append(j)
  43. self.assertEqual(seen, 3 * [0, 0, 1, 1, 2, 2, 3, 3, 4, 4])