mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
  r55238 | guido.van.rossum | 2007-05-10 16:46:05 -0700 (Thu, 10 May 2007) | 9 lines
  Merged revisions 55227 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk
  ........
    r55227 | guido.van.rossum | 2007-05-10 10:20:15 -0700 (Thu, 10 May 2007) | 2 lines
    Fix a bug in test_c_api() that caused a negative refcount.
  ........
................
  r55246 | neal.norwitz | 2007-05-11 00:01:52 -0700 (Fri, 11 May 2007) | 1 line
  Remove commands.getstatus() it is obsolete.
................
  r55248 | neal.norwitz | 2007-05-11 00:29:05 -0700 (Fri, 11 May 2007) | 2 lines
  Remove bsddb185 support.
................
  r55249 | neal.norwitz | 2007-05-11 00:29:50 -0700 (Fri, 11 May 2007) | 1 line
  Remove bsddb185 module too
................
  r55250 | neal.norwitz | 2007-05-11 00:32:13 -0700 (Fri, 11 May 2007) | 1 line
  bsddb185: Gotta remove from the file checked in, not Setup
................
  r55251 | neal.norwitz | 2007-05-11 00:53:26 -0700 (Fri, 11 May 2007) | 1 line
  Remove obsolete IRIX modules (as much as I could find, there is probably more)
................
  r55252 | neal.norwitz | 2007-05-11 00:55:35 -0700 (Fri, 11 May 2007) | 1 line
  Remove SGI turd.
................
  r55254 | georg.brandl | 2007-05-11 03:11:01 -0700 (Fri, 11 May 2007) | 2 lines
  Add a case for set comprehensions to the "cannot assign to" switch.
................
  r55255 | georg.brandl | 2007-05-11 03:11:25 -0700 (Fri, 11 May 2007) | 2 lines
  Fix wrong imports.
................
  r55261 | georg.brandl | 2007-05-11 07:37:48 -0700 (Fri, 11 May 2007) | 2 lines
  Remove removed tex files.
................
  r55262 | georg.brandl | 2007-05-11 08:28:41 -0700 (Fri, 11 May 2007) | 2 lines
  Commit PEP 3132 implementation.
................
  r55264 | georg.brandl | 2007-05-11 08:50:19 -0700 (Fri, 11 May 2007) | 2 lines
  Check in the inevitable AST version number and format Py_ssize_t with %zd.
................
  r55265 | neal.norwitz | 2007-05-11 09:12:22 -0700 (Fri, 11 May 2007) | 1 line
  Remove mention of os.popen* and popen2.* since these will be removed.
................
  r55266 | neal.norwitz | 2007-05-11 09:19:57 -0700 (Fri, 11 May 2007) | 1 line
  Get doc to build again (almost, the doc is fine)
................
  r55267 | neal.norwitz | 2007-05-11 09:21:02 -0700 (Fri, 11 May 2007) | 1 line
  Really get doc to build (remove use of string module)
................
  r55269 | neal.norwitz | 2007-05-11 09:29:43 -0700 (Fri, 11 May 2007) | 1 line
  Add some notes to cleanup later
................
		
	
			
		
			
				
	
	
		
			157 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Tests for extended unpacking, starred expressions.
 | 
						|
 | 
						|
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 = l
 | 
						|
    >>> a == 4 and b == [5, 6]
 | 
						|
    True
 | 
						|
 | 
						|
Unpack implied tuple
 | 
						|
 | 
						|
    >>> *a, = 7, 8, 9
 | 
						|
    >>> a == [7, 8, 9]
 | 
						|
    True
 | 
						|
 | 
						|
Unpack string... fun!
 | 
						|
 | 
						|
    >>> a, *b = 'one'
 | 
						|
    >>> a == 'o' and b == ['n', 'e']
 | 
						|
    True
 | 
						|
 | 
						|
Unpack long sequence
 | 
						|
 | 
						|
    >>> a, b, c, *d, e, f, g = range(10)
 | 
						|
    >>> (a, b, c, d, e, f, g) == (0, 1, 2, [3, 4, 5, 6], 7, 8, 9)
 | 
						|
    True
 | 
						|
 | 
						|
Unpack short sequence
 | 
						|
 | 
						|
    >>> a, *b, c = (1, 2)
 | 
						|
    >>> a == 1 and c == 2 and b == []
 | 
						|
    True
 | 
						|
 | 
						|
Unpack generic sequence
 | 
						|
 | 
						|
    >>> class Seq:
 | 
						|
    ...     def __getitem__(self, i):
 | 
						|
    ...         if i >= 0 and i < 3: return i
 | 
						|
    ...         raise IndexError
 | 
						|
    ...
 | 
						|
    >>> a, *b = Seq()
 | 
						|
    >>> a == 0 and b == [1, 2]
 | 
						|
    True
 | 
						|
 | 
						|
Unpack in for statement
 | 
						|
 | 
						|
    >>> for a, *b, c in [(1,2,3), (4,5,6,7)]:
 | 
						|
    ...     print(a, b, c)
 | 
						|
    ...
 | 
						|
    1 [2] 3
 | 
						|
    4 [5, 6] 7
 | 
						|
 | 
						|
Unpack in list
 | 
						|
 | 
						|
    >>> [a, *b, c] = range(5)
 | 
						|
    >>> a == 0 and b == [1, 2, 3] and c == 4
 | 
						|
    True
 | 
						|
 | 
						|
Multiple targets
 | 
						|
 | 
						|
    >>> a, *b, c = *d, e = range(5)
 | 
						|
    >>> a == 0 and b == [1, 2, 3] and c == 4 and d == [0, 1, 2, 3] and e == 4
 | 
						|
    True
 | 
						|
 | 
						|
Now for some failures
 | 
						|
 | 
						|
Unpacking non-sequence
 | 
						|
 | 
						|
    >>> a, *b = 7
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    TypeError: 'int' object is not iterable
 | 
						|
 | 
						|
Unpacking sequence too short
 | 
						|
 | 
						|
    >>> a, *b, c, d, e = Seq()
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    ValueError: need more than 3 values to unpack
 | 
						|
 | 
						|
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_ex.BozoError
 | 
						|
 | 
						|
Now some general starred expressions (all fail).
 | 
						|
 | 
						|
    >>> a, *b, c, *d, e = range(10) # doctest:+ELLIPSIS
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    SyntaxError: two starred expressions in assignment (...)
 | 
						|
 | 
						|
    >>> [*b, *c] = range(10) # doctest:+ELLIPSIS
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    SyntaxError: two starred expressions in assignment (...)
 | 
						|
 | 
						|
    >>> *a = range(10) # doctest:+ELLIPSIS
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    SyntaxError: starred assignment target must be in a list or tuple (...)
 | 
						|
 | 
						|
    >>> *a # doctest:+ELLIPSIS
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    SyntaxError: can use starred expression only as assignment target (...)
 | 
						|
 | 
						|
    >>> *1 # doctest:+ELLIPSIS
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    SyntaxError: can use starred expression only as assignment target (...)
 | 
						|
 | 
						|
    >>> x = *a # doctest:+ELLIPSIS
 | 
						|
    Traceback (most recent call last):
 | 
						|
      ...
 | 
						|
    SyntaxError: can use starred expression only as assignment target (...)
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
__test__ = {'doctests' : doctests}
 | 
						|
 | 
						|
def test_main(verbose=False):
 | 
						|
    import sys
 | 
						|
    from test import test_support
 | 
						|
    from test import test_unpack_ex
 | 
						|
    test_support.run_doctest(test_unpack_ex, verbose)
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    test_main(verbose=True)
 |