关于python:元组在argspec中解压缩

Tuple unpacking in argspec

我已经使用python2多年了,甚至不知道这个特性,但显然tuple解包在函数defs中得到支持:

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

默认值也是允许的,尽管它们似乎是在函数调用时解包的,而不是在函数定义时解包的。我不知道如何按名称传递一个/任何/所有打包的参数,也许这是不可能的。

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

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

我的问题是,为什么这是一个设计选择,在必要的地方,什么是示例用例?在我看来,这是一个模糊且容易出错的特性,违反了Python1、2、3、5、7、9、13、17的禅……


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

此类参数不能按名称传递。tuple参数有一个内部名称,比如.0,函数的字节码从解包任何tuple参数开始。虽然技术上可以做一些像

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

它不是真的有用。