Python argspec中的元组解包

Python argspec中的元组解包,python,function,grammar,python-2.x,argument-unpacking,Python,Function,Grammar,Python 2.x,Argument Unpacking,我已经使用python2很多年了,甚至都不知道这个特性,但显然,tuple unpacking在函数defs中是受支持的: >>> def foo(a, (b, c)): ... print a, b, c ... >>> t = (2, 3) >>> foo(1, t) 1 2 3 默认值也是允许的,尽管它们似乎是在函数调用时解包的,而不是在函数定义时解包的。我不知道如何按名称传递一个/任何/所有压缩参数,也许这是不可能

我已经使用python2很多年了,甚至都不知道这个特性,但显然,tuple unpacking在函数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
这显然不仅仅是一个奇怪的实现细节:如果仔细阅读,特别是
fpdef
是什么,您会发现函数定义是为元组解包而明确设计的


我的问题是,为什么这是一个设计选择,在有必要的情况下,什么是示例用例?在我看来,这似乎是一个模糊且容易出错的特性,它违反了python 1、2、3、5、7、9、13、17的zen…

该特性是对普通变量赋值中的解包的自然概括。这项功能完全没有必要。它出现在Python3中,因为它没有添加太多内容,并且使内省变得混乱

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

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

,它不是很有用。

该功能是对普通变量赋值中的解包的自然概括。这项功能完全没有必要。它出现在Python3中,因为它没有添加太多内容,并且使内省变得混乱

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

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

,它不是很有用。

谢谢凯文。这个PEP正是我想要的。这个PEP的一个结果是,
sorted(seq,key=lambda(a,b):a*b)
,它过去在Python2.7中工作,现在在Python3中是一个语法错误。谢谢Kevin。这个PEP的一个结果是,过去在Python2.7中工作的
排序(seq,key=lambda(a,b):a*b)
,现在在Python3中是一个语法错误。