PEP-448选摘:Additional Unpacking Generalizations(附加的解包操作推广)

来源:互联网 发布:bioedit软件下载 编辑:程序博客网 时间:2024/06/05 10:10

PEP-448 提议扩宽对*可迭代对象(iterable)解包操作符(unpacking operator)和**字典(dictionary)对象解包操作符的使用限制,使得它们可以出现在更多的地方,更多的情景,而且没有使用次数限制。

该提案分别介绍了在元组(tuple),列表(list),集合(set),字典(dictionary)的对应陈列式(display)的用例:

  1. 元组陈列式

    >>> *range(4), 4
    (0, 1, 2, 3, 4)

  2. 列表陈列式

    >>> [*range(4), 4]
    [0, 1, 2, 3, 4]

  3. 集合陈列式

    >>> {*range(4), 4}
    {0, 1, 2, 3, 4}

  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, = iterableelements = *iterable, 两个式子中,elements的类型不一样,前式中它的类型为列表,后式中为元组。

到这里,PEP-488的重点都介绍完了,现在把这些重点都罗列出来:

  1. 元组陈列式,列表陈列式,集合陈列式,字典陈列式都支持解包操作
  2. 解析式不支持解包操作
  3. 函数调用支持解包操作,**解包必须出现在*解包的位置后面,同时,关键字参数必须出现在位置参数的位置后面
  4. *elements, = iterableelements = *iterable, 两个式子中elements的类型不一样,前式中它的类型为列表,后式中为元组。
0 0
原创粉丝点击