mirror of
https://github.com/python/cpython.git
synced 2025-10-08 16:11:51 +00:00
PEP 448: additional unpacking generalizations (closes #2292)
Patch by Neil Girdhar.
This commit is contained in:
parent
4ccc1514d0
commit
025e9ebd0a
26 changed files with 2664 additions and 2118 deletions
|
@ -71,8 +71,185 @@ Multiple targets
|
|||
>>> a == 0 and b == [1, 2, 3] and c == 4 and d == [0, 1, 2, 3] and e == 4
|
||||
True
|
||||
|
||||
Assignment unpacking
|
||||
|
||||
>>> a, b, *c = range(5)
|
||||
>>> a, b, c
|
||||
(0, 1, [2, 3, 4])
|
||||
>>> *a, b, c = a, b, *c
|
||||
>>> a, b, c
|
||||
([0, 1, 2], 3, 4)
|
||||
|
||||
Set display element unpacking
|
||||
|
||||
>>> a = [1, 2, 3]
|
||||
>>> sorted({1, *a, 0, 4})
|
||||
[0, 1, 2, 3, 4]
|
||||
|
||||
>>> {1, *1, 0, 4}
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: 'int' object is not iterable
|
||||
|
||||
Dict display element unpacking
|
||||
|
||||
>>> kwds = {'z': 0, 'w': 12}
|
||||
>>> sorted({'x': 1, 'y': 2, **kwds}.items())
|
||||
[('w', 12), ('x', 1), ('y', 2), ('z', 0)]
|
||||
|
||||
>>> sorted({**{'x': 1}, 'y': 2, **{'z': 3}}.items())
|
||||
[('x', 1), ('y', 2), ('z', 3)]
|
||||
|
||||
>>> sorted({**{'x': 1}, 'y': 2, **{'x': 3}}.items())
|
||||
[('x', 3), ('y', 2)]
|
||||
|
||||
>>> sorted({**{'x': 1}, **{'x': 3}, 'x': 4}.items())
|
||||
[('x', 4)]
|
||||
|
||||
>>> {**{}}
|
||||
{}
|
||||
|
||||
>>> a = {}
|
||||
>>> {**a}[0] = 1
|
||||
>>> a
|
||||
{}
|
||||
|
||||
>>> {**1}
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: 'int' object is not a mapping
|
||||
|
||||
>>> {**[]}
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: 'list' object is not a mapping
|
||||
|
||||
>>> len(eval("{" + ", ".join("**{{{}: {}}}".format(i, i)
|
||||
... for i in range(1000)) + "}"))
|
||||
1000
|
||||
|
||||
List comprehension element unpacking
|
||||
|
||||
>>> a, b, c = [0, 1, 2], 3, 4
|
||||
>>> [*a, b, c]
|
||||
[0, 1, 2, 3, 4]
|
||||
|
||||
>>> l = [a, (3, 4), {5}, {6: None}, (i for i in range(7, 10))]
|
||||
>>> [*item for item in l]
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: iterable unpacking cannot be used in comprehension
|
||||
|
||||
>>> [*[0, 1] for i in range(10)]
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: iterable unpacking cannot be used in comprehension
|
||||
|
||||
>>> [*'a' for i in range(10)]
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: iterable unpacking cannot be used in comprehension
|
||||
|
||||
>>> [*[] for i in range(10)]
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: iterable unpacking cannot be used in comprehension
|
||||
|
||||
Generator expression in function arguments
|
||||
|
||||
>>> list(*x for x in (range(5) for i in range(3)))
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
list(*x for x in (range(5) for i in range(3)))
|
||||
^
|
||||
SyntaxError: invalid syntax
|
||||
|
||||
>>> dict(**x for x in [{1:2}])
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
dict(**x for x in [{1:2}])
|
||||
^
|
||||
SyntaxError: invalid syntax
|
||||
|
||||
Iterable argument unpacking
|
||||
|
||||
>>> print(*[1], *[2], 3)
|
||||
1 2 3
|
||||
|
||||
Make sure that they don't corrupt the passed-in dicts.
|
||||
|
||||
>>> def f(x, y):
|
||||
... print(x, y)
|
||||
...
|
||||
>>> original_dict = {'x': 1}
|
||||
>>> f(**original_dict, y=2)
|
||||
1 2
|
||||
>>> original_dict
|
||||
{'x': 1}
|
||||
|
||||
Now for some failures
|
||||
|
||||
Make sure the raised errors are right for keyword argument unpackings
|
||||
|
||||
>>> from collections.abc import MutableMapping
|
||||
>>> class CrazyDict(MutableMapping):
|
||||
... def __init__(self):
|
||||
... self.d = {}
|
||||
...
|
||||
... def __iter__(self):
|
||||
... for x in self.d.__iter__():
|
||||
... if x == 'c':
|
||||
... self.d['z'] = 10
|
||||
... yield x
|
||||
...
|
||||
... def __getitem__(self, k):
|
||||
... return self.d[k]
|
||||
...
|
||||
... def __len__(self):
|
||||
... return len(self.d)
|
||||
...
|
||||
... def __setitem__(self, k, v):
|
||||
... self.d[k] = v
|
||||
...
|
||||
... def __delitem__(self, k):
|
||||
... del self.d[k]
|
||||
...
|
||||
>>> d = CrazyDict()
|
||||
>>> d.d = {chr(ord('a') + x): x for x in range(5)}
|
||||
>>> e = {**d}
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
RuntimeError: dictionary changed size during iteration
|
||||
|
||||
>>> d.d = {chr(ord('a') + x): x for x in range(5)}
|
||||
>>> def f(**kwargs): print(kwargs)
|
||||
>>> f(**d)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
RuntimeError: dictionary changed size during iteration
|
||||
|
||||
Overridden parameters
|
||||
|
||||
>>> f(x=5, **{'x': 3}, y=2)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() got multiple values for keyword argument 'x'
|
||||
|
||||
>>> f(**{'x': 3}, x=5, y=2)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() got multiple values for keyword argument 'x'
|
||||
|
||||
>>> f(**{'x': 3}, **{'x': 5}, y=2)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() got multiple values for keyword argument 'x'
|
||||
|
||||
>>> f(**{1: 3}, **{1: 5})
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() keywords must be strings
|
||||
|
||||
Unpacking non-sequence
|
||||
|
||||
>>> a, *b = 7
|
||||
|
@ -138,17 +315,17 @@ Now some general starred expressions (all fail).
|
|||
>>> *a # doctest:+ELLIPSIS
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: can use starred expression only as assignment target
|
||||
SyntaxError: can't use starred expression here
|
||||
|
||||
>>> *1 # doctest:+ELLIPSIS
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: can use starred expression only as assignment target
|
||||
SyntaxError: can't use starred expression here
|
||||
|
||||
>>> x = *a # doctest:+ELLIPSIS
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: can use starred expression only as assignment target
|
||||
SyntaxError: can't use starred expression here
|
||||
|
||||
Some size constraints (all fail.)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue