在函数调用中管理* args方差

时间:2009-11-23 18:13:22

标签: python

有一个带有以下签名的方法:

def foo(self, bar, *uks):
    return other_method(..., uks)

通常这称为:

instance.foo(1234, a, b, c, d)

但是在某些情况下我需要做这样的事情:

p = [a, b, c, d]
instance.foo(1234, p)

在接收端,这不起作用,因为other_method看到*args由单个列表对象组成,而不仅仅是[a, b, c, d]列表构造。如果我输入方法为:

def foo(self, bar, uks = []):
    return other_method(..., uks)

它有效,但我每次都被迫这样做:

instance.foo(1234, [a, b, c, d])

我猜这不是什么大不了的事,但我只是想知道我是否错过了更多的pythonic方法呢?

谢谢!

3 个答案:

答案 0 :(得分:3)

Python支持unpacking of argument lists来处理这种情况。以下两个调用是等效的:

常规电话:

instance.foo(1234, a, b, c, d)

参数列表扩展:

p = [a, b, c, d]
instance.foo(1234, *p)

答案 1 :(得分:2)

p = [a, b, c, d]
instance.foo(1234, *p)

*p形式是这里的关键部分 - 它意味着“将序列p扩展为单独的位置参数”。

答案 2 :(得分:1)

我认为你在这里得到的答案是正确的。这是一个完全充实的例子:

class MyObject(object):
    def foo(self, bar, *uks):
        return self.other_method(1, uks)

    def other_method(self, x, uks):
        print "uks is %r" % (uks,)

# sample data...
a, b, c, d = 'a', 'b', 'c', 'd'

instance = MyObject()

print "Called as separate arguments:"
instance.foo(1234, a, b, c, d)

print "Called as a list:"
p = [a, b, c, d]
instance.foo(1234, *p)

运行时,会打印:

Called as separate arguments:
uks is ('a', 'b', 'c', 'd')
Called as a list:
uks is ('a', 'b', 'c', 'd')

你在Alex的回答中说你得到了([a, b, c, d],),但我看不出来。