summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_unpack_ex.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-05-11 16:50:42 (GMT)
committerGuido van Rossum <guido@python.org>2007-05-11 16:50:42 (GMT)
commit0368b726a1859e3c063df5a93f19ccb4254be22a (patch)
tree4e65a593d48f9103facb47b741f8ed97d755286f /Lib/test/test_unpack_ex.py
parentbdde01168fc91d02a2d3bc8399255944fdfdd69f (diff)
downloadcpython-0368b726a1859e3c063df5a93f19ccb4254be22a.zip
cpython-0368b726a1859e3c063df5a93f19ccb4254be22a.tar.gz
cpython-0368b726a1859e3c063df5a93f19ccb4254be22a.tar.bz2
Merged revisions 55225-55227,55229-55269 via svnmerge from
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 ................
Diffstat (limited to 'Lib/test/test_unpack_ex.py')
-rw-r--r--Lib/test/test_unpack_ex.py157
1 files changed, 157 insertions, 0 deletions
diff --git a/Lib/test/test_unpack_ex.py b/Lib/test/test_unpack_ex.py
new file mode 100644
index 0000000..557e449
--- /dev/null
+++ b/Lib/test/test_unpack_ex.py
@@ -0,0 +1,157 @@
+# 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)