mirror of
				https://github.com/python/cpython.git
				synced 2025-11-02 22:51:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			130 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
	
		
			2.6 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: 'int' object is not iterable
 | 
						|
 | 
						|
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: need more than 3 values to unpack
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
__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)
 |