有一个带有以下签名的方法:
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方法呢?
谢谢!
答案 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],)
,但我看不出来。