Python参数解包

Python参数解包,python,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, ')' ... >&g

有时,一些函数交换一些真正特殊的数据元组

>>> 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, ')'
这使它对读者来说更为简洁。这只是一行代码,但也是完全不必要的代码,而且它还使函数的签名看起来更清晰

这项技术有没有隐藏的陷阱? 这是一个普遍不受欢迎的功能(在这种情况下,我对原因感兴趣)

我使用Python2.7。谢谢

在Python3中。根据政治公众人物3113:

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

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

  • 反思问题
  • 如果移除,则不会损失技能
  • 例外
  • 非信息性错误消息
  • 少用

我不知道你在问什么。如果是“我的程序是否在做一些奇怪的事情,可能不是最佳实践”,答案看起来像是“是的”。如果是“Python是否在做一些奇怪的事情”,那么答案通常是“不,除非它是Python 2的特性,而Python 3已经删除了它。”我通常会发现,当你真的不记得元组元素顺序是什么时,它会在6个月内变成一团无法维护的混乱。一般来说,当我这样做的时候,我总是后悔没有创建类……我更喜欢
f(1,2,*foo())
def(a,b,x,y,z)
而不是
f(1,2,foo())
def(a,b,(x,y,z))
。它可以在python2和python3中工作,还可以保持代码的可读性。@hgf(1,2,*foo())也可以,只是现在必须只使用一个元组,并且始终放在参数列表的末尾。这是正确的,它不允许使用其他用例。我相信,从我对python3的偏见来看:),python2/3的兼容性是非常重要的。出于这个原因,我会将其解包到函数中,或者将其保存在args的末尾。PS:出于同样的原因,我也会使用future print函数OP中的代码似乎在Python 3中工作(在
print
参数周围添加了括号,用
f(1,2,(1,2,4))
调用)。哦,我明白了,第二个代码片段,是的。我专注于第一个片段;我的错,就是这样,谢谢!在当前的项目中,我对兼容性不感兴趣,但很高兴知道使用它会降低代码的兼容性。