152 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| doctests = """
 | |
| 
 | |
| Unpack tuple
 | |
| 
 | |
|     >>> t = (1, 2, 3)
 | |
|     >>> a, b, c = t
 | |
|     >>> a == 1 and b == 2 and c == 3
 | |
|     True
 | |
| 
 | |
| Unpack list
 | |
| 
 | |
|     >>> l = [4, 5, 6]
 | |
|     >>> a, b, c = l
 | |
|     >>> a == 4 and b == 5 and c == 6
 | |
|     True
 | |
| 
 | |
| Unpack implied tuple
 | |
| 
 | |
|     >>> a, b, c = 7, 8, 9
 | |
|     >>> a == 7 and b == 8 and c == 9
 | |
|     True
 | |
| 
 | |
| Unpack string... fun!
 | |
| 
 | |
|     >>> a, b, c = 'one'
 | |
|     >>> a == 'o' and b == 'n' and c == 'e'
 | |
|     True
 | |
| 
 | |
| Unpack generic sequence
 | |
| 
 | |
|     >>> class Seq:
 | |
|     ...     def __getitem__(self, i):
 | |
|     ...         if i >= 0 and i < 3: return i
 | |
|     ...         raise IndexError
 | |
|     ...
 | |
|     >>> a, b, c = Seq()
 | |
|     >>> a == 0 and b == 1 and c == 2
 | |
|     True
 | |
| 
 | |
| Single element unpacking, with extra syntax
 | |
| 
 | |
|     >>> st = (99,)
 | |
|     >>> sl = [100]
 | |
|     >>> a, = st
 | |
|     >>> a
 | |
|     99
 | |
|     >>> b, = sl
 | |
|     >>> b
 | |
|     100
 | |
| 
 | |
| Now for some failures
 | |
| 
 | |
| Unpacking non-sequence
 | |
| 
 | |
|     >>> a, b, c = 7
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     TypeError: cannot unpack non-iterable int object
 | |
| 
 | |
| Unpacking tuple of wrong size
 | |
| 
 | |
|     >>> a, b = t
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     ValueError: too many values to unpack (expected 2)
 | |
| 
 | |
| Unpacking tuple of wrong size
 | |
| 
 | |
|     >>> a, b = l
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     ValueError: too many values to unpack (expected 2)
 | |
| 
 | |
| Unpacking sequence too short
 | |
| 
 | |
|     >>> a, b, c, d = Seq()
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     ValueError: not enough values to unpack (expected 4, got 3)
 | |
| 
 | |
| Unpacking sequence too long
 | |
| 
 | |
|     >>> a, b = Seq()
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     ValueError: too many values to unpack (expected 2)
 | |
| 
 | |
| Unpacking a sequence where the test for too long raises a different kind of
 | |
| error
 | |
| 
 | |
|     >>> class BozoError(Exception):
 | |
|     ...     pass
 | |
|     ...
 | |
|     >>> class BadSeq:
 | |
|     ...     def __getitem__(self, i):
 | |
|     ...         if i >= 0 and i < 3:
 | |
|     ...             return i
 | |
|     ...         elif i == 3:
 | |
|     ...             raise BozoError
 | |
|     ...         else:
 | |
|     ...             raise IndexError
 | |
|     ...
 | |
| 
 | |
| Trigger code while not expecting an IndexError (unpack sequence too long, wrong
 | |
| error)
 | |
| 
 | |
|     >>> a, b, c, d, e = BadSeq()
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     test.test_unpack.BozoError
 | |
| 
 | |
| Trigger code while expecting an IndexError (unpack sequence too short, wrong
 | |
| error)
 | |
| 
 | |
|     >>> a, b, c = BadSeq()
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     test.test_unpack.BozoError
 | |
| 
 | |
| Allow unpacking empty iterables
 | |
| 
 | |
|     >>> () = []
 | |
|     >>> [] = ()
 | |
|     >>> [] = []
 | |
|     >>> () = ()
 | |
| 
 | |
| Unpacking non-iterables should raise TypeError
 | |
| 
 | |
|     >>> () = 42
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     TypeError: cannot unpack non-iterable int object
 | |
| 
 | |
| Unpacking to an empty iterable should raise ValueError
 | |
| 
 | |
|     >>> () = [42]
 | |
|     Traceback (most recent call last):
 | |
|       ...
 | |
|     ValueError: too many values to unpack (expected 0)
 | |
| 
 | |
| """
 | |
| 
 | |
| __test__ = {'doctests' : doctests}
 | |
| 
 | |
| def test_main(verbose=False):
 | |
|     from test import support
 | |
|     from test import test_unpack
 | |
|     support.run_doctest(test_unpack, verbose)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     test_main(verbose=True)
 |