0

我已经使用 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

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

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

4

1 回答 1

3

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

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

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

,其实用处不大。

于 2016-03-30T23:54:17.810 回答