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 |
这显然不仅仅是一个奇怪的实现细节:如果您仔细阅读语法,特别是
我的问题是,为什么这是一个设计选择,在必要的地方,什么是示例用例?在我看来,这是一个模糊且容易出错的特性,违反了Python1、2、3、5、7、9、13、17的禅……
型
这个特性是作为普通变量赋值中可以进行的解包的自然概括而引入的。这项功能完全没有必要。它在python 3中被删除,因为它没有添加太多内容,并且使自省变得混乱。
此类参数不能按名称传递。tuple参数有一个内部名称,比如
1 2 3 4 5 | >>> def f((a, b)): ... print a, b ... >>> f(**{'.0': (0, 1)}) 0 1 |
它不是真的有用。