1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
| ó
| R\¬Qc @ s? d Z i e d 6Z e d Z e d k r; e d e n d S( sù
|
| 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
|
| Unpacking tuple of wrong size
|
| >>> a, b = l
| Traceback (most recent call last):
| ...
| ValueError: too many values to unpack
|
| 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
|
| 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):
| ...
| BozoError
|
| Trigger code while expecting an IndexError (unpack sequence too short, wrong
| error)
|
| >>> a, b, c = BadSeq()
| Traceback (most recent call last):
| ...
| BozoError
|
| t doctestsc C s4 d d l m } d d l m } | j | | d S( Niÿÿÿÿ( t test_support( t test_unpack( t testR R t run_doctest( t verboseR R ( ( sX /tmp/ndk-User/buildhost/install/prebuilt/darwin-x86_64/lib/python2.7/test/test_unpack.pyt |
|