[Python-checkins] CVS: python/dist/src/Lib/test test_generators.py,1.1,1.2

Tim Peters tim_one@users.sourceforge.net
Sat, 23 Jun 2001 13:45:45 -0700


Update of /cvsroot/python/python/dist/src/Lib/test
In directory usw-pr-cvs1:/tmp/cvs-serv19568/python/dist/src/Lib/test

Modified Files:
	test_generators.py 
Log Message:
Add all the examples from PEP 255, and a few email examples.


Index: test_generators.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_generators.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** test_generators.py	2001/06/23 20:27:04	1.1
--- test_generators.py	2001/06/23 20:45:43	1.2
***************
*** 1,3 ****
! simple_tests = """
  Let's try a simple generator:
  
--- 1,3 ----
! tutorial_tests = """
  Let's try a simple generator:
  
***************
*** 125,129 ****
  """
  
! __test__ = {"simple": simple_tests}
  
  # Magic test name that regrtest.py invokes *after* importing this module.
--- 125,310 ----
  """
  
! # The examples from PEP 255.
! 
! pep_tests = """
! 
! Specification: Return
! 
!     Note that return isn't always equivalent to raising StopIteration:  the
!     difference lies in how enclosing try/except constructs are treated.
!     For example,
! 
!         >>> def f1():
!         ...     try:
!         ...         return
!         ...     except:
!         ...        yield 1
!         >>> print list(f1())
!         []
! 
!     because, as in any function, return simply exits, but
! 
!         >>> def f2():
!         ...     try:
!         ...         raise StopIteration
!         ...     except:
!         ...         yield 42
!         >>> print list(f2())
!         [42]
! 
!     because StopIteration is captured by a bare "except", as is any
!     exception.
! 
! Specification: Generators and Exception Propagation
! 
!     >>> def f():
!     ...     return 1/0
!     >>> def g():
!     ...     yield f()  # the zero division exception propagates
!     ...     yield 42   # and we'll never get here
!     >>> k = g()
!     >>> k.next()
!     Traceback (most recent call last):
!       File "<stdin>", line 1, in ?
!       File "<stdin>", line 2, in g
!       File "<stdin>", line 2, in f
!     ZeroDivisionError: integer division or modulo by zero
!     >>> k.next()  # and the generator cannot be resumed
!     Traceback (most recent call last):
!       File "<stdin>", line 1, in ?
!     StopIteration
!     >>>
! 
! Specification: Try/Except/Finally
! 
!     >>> def f():
!     ...     try:
!     ...         yield 1
!     ...         try:
!     ...             yield 2
!     ...             1/0
!     ...             yield 3  # never get here
!     ...         except ZeroDivisionError:
!     ...             yield 4
!     ...             yield 5
!     ...             raise
!     ...         except:
!     ...             yield 6
!     ...         yield 7     # the "raise" above stops this
!     ...     except:
!     ...         yield 8
!     ...     yield 9
!     ...     try:
!     ...         x = 12
!     ...     finally:
!     ...         yield 10
!     ...     yield 11
!     >>> print list(f())
!     [1, 2, 4, 5, 8, 9, 10, 11]
!     >>>
! 
! 
! Guido's binary tree example.
! 
!     >>> # A binary tree class.
!     >>> class Tree:
!     ...
!     ...     def __init__(self, label, left=None, right=None):
!     ...         self.label = label
!     ...         self.left = left
!     ...         self.right = right
!     ...
!     ...     def __repr__(self, level=0, indent="    "):
!     ...         s = level*indent + `self.label`
!     ...         if self.left:
!     ...             s = s + "\\n" + self.left.__repr__(level+1, indent)
!     ...         if self.right:
!     ...             s = s + "\\n" + self.right.__repr__(level+1, indent)
!     ...         return s
!     ...
!     ...     def __iter__(self):
!     ...         return inorder(self)
! 
!     >>> # Create a Tree from a list.
!     >>> def tree(list):
!     ...     n = len(list)
!     ...     if n == 0:
!     ...         return []
!     ...     i = n / 2
!     ...     return Tree(list[i], tree(list[:i]), tree(list[i+1:]))
! 
!     >>> # Show it off: create a tree.
!     >>> t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
! 
!     >>> # A recursive generator that generates Tree leaves in in-order.
!     >>> def inorder(t):
!     ...     if t:
!     ...         for x in inorder(t.left):
!     ...             yield x
!     ...         yield t.label
!     ...         for x in inorder(t.right):
!     ...             yield x
! 
!     >>> # Show it off: create a tree.
!     ... t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
!     ... # Print the nodes of the tree in in-order.
!     ... for x in t:
!     ...     print x,
!     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
! 
!     >>> # A non-recursive generator.
!     >>> def inorder(node):
!     ...     stack = []
!     ...     while node:
!     ...         while node.left:
!     ...             stack.append(node)
!     ...             node = node.left
!     ...         yield node.label
!     ...         while not node.right:
!     ...             try:
!     ...                 node = stack.pop()
!     ...             except IndexError:
!     ...                 return
!     ...             yield node.label
!     ...         node = node.right
! 
!     >>> # Exercise the non-recursive generator.
!     >>> for x in t:
!     ...     print x,
!     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
! 
! """
! 
! # A few examples from Iterator-List and Python-Dev email.
! 
! email_tests = """
! 
! The difference between yielding None and returning it.
! 
! >>> def g():
! ...     for i in range(3):
! ...         yield None
! ...     yield None
! ...     return
! >>> list(g())
! [None, None, None, None]
! 
! Ensure that explicitly raising StopIteration acts like any other exception
! in try/except, not like a return.
! 
! >>> def g():
! ...     yield 1
! ...     try:
! ...         raise StopIteration
! ...     except:
! ...         yield 2
! ...     yield 3
! >>> list(g())
! [1, 2, 3]
! """
! 
! __test__ = {"tut": tutorial_tests,
!             "pep": pep_tests,
!             "zemail": email_tests}
  
  # Magic test name that regrtest.py invokes *after* importing this module.