argspec 中的元组解包
Tuple unpacking in argspec
我已经使用 python2 多年,甚至不知道这个功能,但显然函数 defs 支持元组解包:
>>> def foo(a, (b, c)):
... print a, b, c
...
>>> t = (2, 3)
>>> foo(1, t)
1 2 3
默认值也是允许的,尽管它们似乎是在函数调用时而不是函数定义时解包的。而且我无法弄清楚如何按名称传递 one/any/all 打包参数,也许这是不可能的。
>>> def foo(a, ((b, c), d)=('xy', 8)):
print a, b, c, d
...
>>> foo(0)
0 x y 8
这显然不仅仅是一个奇怪的实现细节:如果您仔细阅读 grammar,尤其是 fpdef
是什么,您会发现函数定义是明确设计用于元组解包的。
我的问题是,为什么这是一个设计选择,什么是必要的示例用例?对我来说,这似乎是一个模糊且容易出错的功能,违反了 python 1, 2, 3, 5, 7, 9, 13, 17....
该功能是作为您可以在普通变量赋值中进行的拆包的自然概括而引入的。该功能是完全没有必要的。它是 removed 在 Python 3 中,因为它没有添加太多并且使内省变得混乱。
像这样的参数不能按名称传递。元组参数被赋予一个内部名称,如 .0
,函数的字节码从解包任何元组参数开始。虽然技术上可以做类似
的事情
>>> def f((a, b)):
... print a, b
...
>>> f(**{'.0': (0, 1)})
0 1
,用处不大
我已经使用 python2 多年,甚至不知道这个功能,但显然函数 defs 支持元组解包:
>>> def foo(a, (b, c)):
... print a, b, c
...
>>> t = (2, 3)
>>> foo(1, t)
1 2 3
默认值也是允许的,尽管它们似乎是在函数调用时而不是函数定义时解包的。而且我无法弄清楚如何按名称传递 one/any/all 打包参数,也许这是不可能的。
>>> def foo(a, ((b, c), d)=('xy', 8)):
print a, b, c, d
...
>>> foo(0)
0 x y 8
这显然不仅仅是一个奇怪的实现细节:如果您仔细阅读 grammar,尤其是 fpdef
是什么,您会发现函数定义是明确设计用于元组解包的。
我的问题是,为什么这是一个设计选择,什么是必要的示例用例?对我来说,这似乎是一个模糊且容易出错的功能,违反了 python 1, 2, 3, 5, 7, 9, 13, 17....
该功能是作为您可以在普通变量赋值中进行的拆包的自然概括而引入的。该功能是完全没有必要的。它是 removed 在 Python 3 中,因为它没有添加太多并且使内省变得混乱。
像这样的参数不能按名称传递。元组参数被赋予一个内部名称,如 .0
,函数的字节码从解包任何元组参数开始。虽然技术上可以做类似
>>> def f((a, b)):
... print a, b
...
>>> f(**{'.0': (0, 1)})
0 1
,用处不大