元组在argspec

时间:2016-03-30 23:48:06

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

这些参数不能按名称传递。 tuple参数的内部名称为.0,函数的字节码通过解压缩任何元组参数开始。虽然在技术上可以做一些像

这样的事情
>>> def f((a, b)):
...     print a, b
...
>>> f(**{'.0': (0, 1)})
0 1

,它没有用处。