PEP-448 提议扩宽对*
可迭代对象(iterable)解包操作符(unpacking operator)和**
字典(dictionary)对象解包操作符的使用限制,使得它们可以出现在更多的地方,更多的情景,而且没有使用次数限制。
该提案分别介绍了在元组(tuple),列表(list),集合(set),字典(dictionary)的对应陈列式(display)的用例:
元组陈列式
>>> *range(4), 4
(0, 1, 2, 3, 4)
列表陈列式
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
集合陈列式
>>> {*range(4), 4}
{0, 1, 2, 3, 4}
字典陈列式
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
并且提到在字典中,后来的值总是覆盖(override)先前的值:
>>> {'x': 1, **{'x': 2}}
{'x': 2}
>>> {**{'x': 2}, 'x': 1}
{'x': 1}
在该提案中没有对解包操作符在解析式(comprehension)中的使用说明,笔者尝试用Python 3.5.2
的解释器进行试验,结果显示在解析式中,两种解包操作符均不被支持。
在该提案的规范(specification)部分,介绍了解包操作在函数调用中的使用情况。
Function calls may accept an unbounded number of * and * unpackings. There will be no restriction of the order of positional arguments with relation to unpackings nor any restriction of the order of keyword arguments with relation to ** unpackings.
Function calls continue to have the restriction that keyword arguments must follow positional arguments and * unpackings must additionally follow unpackings.
翻译成中文就是:函数调用可以接受不限数量的*
和**
解包操作。*
解包相对于位置参数的位置顺序没有限制,**
解包相对于关键字参数的位置顺序也没有限制。函数调用依然限制关键字参数必须跟在位置参数后面,**
解包必须跟在*
解包后面。
函数调用时的形式限制如下:
function(
argument or *args, argument or *args, ...,
kwargument or *args, kwargument or *args, ...,
kwargument or **kwargs, kwargument or **kwargs, ...
)
最后需要特别注意的是:*elements, = iterable
和elements = *iterable,
两个式子中,elements
的类型不一样,前式中它的类型为列表,后式中为元组。
到这里,PEP-488的重点都介绍完了,现在把这些重点都罗列出来:
- 元组陈列式,列表陈列式,集合陈列式,字典陈列式都支持解包操作
- 解析式不支持解包操作
- 函数调用支持解包操作,
**
解包必须出现在*
解包的位置后面,同时,关键字参数必须出现在位置参数的位置后面 *elements, = iterable
和elements = *iterable,
两个式子中elements
的类型不一样,前式中它的类型为列表,后式中为元组。