Python参数解包

时间:2015-08-03 22:14:21

标签: python

有时,某些功能会交换一些非常特殊的数据元组。

>>> def foo():
...    return (1,2,4)
...
>>> def f(a, b, v):
...    x, y, z = v
...    # ...
...    # suppose there are 2-4 lines of some trivial code
...    # ...
...    print a, b, '(', x, y, z, ')'
...
>>> f(1, 2, foo())
1 2 ( 1 2 4 )

这里的用例是它真的是临时的数据集,所以我们不想引入新的类。 (我们还假设元组本身只是一堆数据,因此通过索引访问元组的元素,如print a, b, '(', v[0], v[1], v[2], ')'会让读者感到困惑。)

所以,无论如何。我们决定传递元组,我们想解包(解构)它们。很酷的是,您可以在函数的参数列表中解压缩参数元组,因此f可以简化一点:

>>> def f(a, b, (x,y,z)):
...    # ...
...    # the same implementation
...    # ...
...    print a, b, '(', x, y, z, ')'

它让读者感觉更清洁。它只是一行代码,但它也是完全不必要的代码,它还使函数的签名看起来更清晰。

这种技术有任何隐藏的陷阱吗? 这是一个普遍不赞成的特征(在这种情况下,我对这个原因感兴趣)?

我使用python 2.7。谢谢!

1 个答案:

答案 0 :(得分:5)

在Python3中,Tuple Parameter Unpacking feature is removed。按照PEP 3113:

  

不幸的是,Python丰富的功能签名功能的这一特性虽然在某些情况下很方便,但却导致了更多的问题。

所以不要使用它;它将使您的代码仅与Python2兼容。 避免在PEP中讨论的元组参数解包的其他原因包括

  • 内省问题
  • 如果删除则不会丧失能力
  • 规则的例外
  • 无信息错误消息
  • Little Usage