我已经使用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的禅.......
答案 0 :(得分:3)
该功能作为普通变量赋值中可以执行的解包的自然概括。该功能完全没必要。在Python 3中它是removed,因为它没有添加太多并使内省变得混乱。
这些参数不能按名称传递。 tuple参数的内部名称为.0
,函数的字节码通过解压缩任何元组参数开始。虽然在技术上可以做一些像
>>> def f((a, b)):
... print a, b
...
>>> f(**{'.0': (0, 1)})
0 1
,它没有用处。