【问题标题】:Tuple unpacking in argspec [closed]argspec 中的元组解包 [关闭]
【发布时间】:2016-07-19 05:17:00
【问题描述】:

我已经使用 python2 多年,甚至不知道这个功能,但显然函数 defs 支持元组解包:

>>> def foo(a, (b, c)):
...     print a, b, c
...     
>>> t = (2, 3)
>>> foo(1, t)
1 2 3

默认值也是允许的,尽管它们似乎是在函数调用时而不是函数定义时解压的。而且我无法弄清楚如何通过名称传递一个/任何/所有打包参数,也许这是不可能的。

>>> def foo(a, ((b, c), d)=('xy', 8)):
        print a, b, c, d
...     
>>> foo(0)
0 x y 8

这显然不仅仅是一个奇怪的实现细节:如果你仔细阅读grammar,特别是fpdef 是什么,你会发现函数定义是为元组解包而明确设计的。

我的问题是,为什么这是一个设计选择,什么是必要的示例用例?对我来说,这似乎是一个晦涩且容易出错的功能,它违反了 python 1、2、3、5、7、9、13、17....的禅宗。

【问题讨论】:

    标签: python function grammar python-2.x argument-unpacking


    【解决方案1】:

    该功能是作为您可以在普通变量赋值中进行的解包的自然概括。该功能完全没有必要。它在 Python 3 中是 removed,因为它没有添加太多内容,并且使自省变得混乱。

    这样的参数不能通过名称传递。元组参数被赋予一个内部名称,如.0,函数的字节码从解包任何元组参数开始。虽然技术上可以做类似的事情

    >>> def f((a, b)):
    ...     print a, b
    ...
    >>> f(**{'.0': (0, 1)})
    0 1
    

    ,其实用处不大。

    【讨论】:

    • 谢谢凯文。那个 PEP 正是我想要的。
    • 这个 PEP 的一个后果是,以前在 Python 2.7 中工作的 sorted(seq, key=lambda (a,b): a*b) 现在在 Python 3 中是一个语法错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2016-09-28
    • 2014-11-20
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多