1doctests = """
2
3Unpack tuple
4
5    >>> t = (1, 2, 3)
6    >>> a, b, c = t
7    >>> a == 1 and b == 2 and c == 3
8    True
9
10Unpack list
11
12    >>> l = [4, 5, 6]
13    >>> a, b, c = l
14    >>> a == 4 and b == 5 and c == 6
15    True
16
17Unpack implied tuple
18
19    >>> a, b, c = 7, 8, 9
20    >>> a == 7 and b == 8 and c == 9
21    True
22
23Unpack string... fun!
24
25    >>> a, b, c = 'one'
26    >>> a == 'o' and b == 'n' and c == 'e'
27    True
28
29Unpack generic sequence
30
31    >>> class Seq:
32    ...     def __getitem__(self, i):
33    ...         if i >= 0 and i < 3: return i
34    ...         raise IndexError
35    ...
36    >>> a, b, c = Seq()
37    >>> a == 0 and b == 1 and c == 2
38    True
39
40Single element unpacking, with extra syntax
41
42    >>> st = (99,)
43    >>> sl = [100]
44    >>> a, = st
45    >>> a
46    99
47    >>> b, = sl
48    >>> b
49    100
50
51Now for some failures
52
53Unpacking non-sequence
54
55    >>> a, b, c = 7
56    Traceback (most recent call last):
57      ...
58    TypeError: 'int' object is not iterable
59
60Unpacking tuple of wrong size
61
62    >>> a, b = t
63    Traceback (most recent call last):
64      ...
65    ValueError: too many values to unpack (expected 2)
66
67Unpacking tuple of wrong size
68
69    >>> a, b = l
70    Traceback (most recent call last):
71      ...
72    ValueError: too many values to unpack (expected 2)
73
74Unpacking sequence too short
75
76    >>> a, b, c, d = Seq()
77    Traceback (most recent call last):
78      ...
79    ValueError: not enough values to unpack (expected 4, got 3)
80
81Unpacking sequence too long
82
83    >>> a, b = Seq()
84    Traceback (most recent call last):
85      ...
86    ValueError: too many values to unpack (expected 2)
87
88Unpacking a sequence where the test for too long raises a different kind of
89error
90
91    >>> class BozoError(Exception):
92    ...     pass
93    ...
94    >>> class BadSeq:
95    ...     def __getitem__(self, i):
96    ...         if i >= 0 and i < 3:
97    ...             return i
98    ...         elif i == 3:
99    ...             raise BozoError
100    ...         else:
101    ...             raise IndexError
102    ...
103
104Trigger code while not expecting an IndexError (unpack sequence too long, wrong
105error)
106
107    >>> a, b, c, d, e = BadSeq()
108    Traceback (most recent call last):
109      ...
110    test.test_unpack.BozoError
111
112Trigger code while expecting an IndexError (unpack sequence too short, wrong
113error)
114
115    >>> a, b, c = BadSeq()
116    Traceback (most recent call last):
117      ...
118    test.test_unpack.BozoError
119
120Allow unpacking empty iterables
121
122    >>> () = []
123    >>> [] = ()
124    >>> [] = []
125    >>> () = ()
126
127Unpacking non-iterables should raise TypeError
128
129    >>> () = 42
130    Traceback (most recent call last):
131      ...
132    TypeError: 'int' object is not iterable
133
134Unpacking to an empty iterable should raise ValueError
135
136    >>> () = [42]
137    Traceback (most recent call last):
138      ...
139    ValueError: too many values to unpack (expected 0)
140
141"""
142
143__test__ = {'doctests' : doctests}
144
145def test_main(verbose=False):
146    from test import support
147    from test import test_unpack
148    support.run_doctest(test_unpack, verbose)
149
150if __name__ == "__main__":
151    test_main(verbose=True)
152