【发布时间】:2016-11-12 11:51:31
【问题描述】:
我正在调用一个函数
foo(x,y0=y[0],y1=y[1],y2=y[2],...,y<d>=y[<d>])
其中<d> 是一个很大的数字,可能因呼叫而异。除 x 之外的所有参数都是关键字参数。
我自己没有写foo,所以我不能只是将y 作为列表传递。有没有一种自动的方法将列表拆分为关键字参数?
【问题讨论】:
我正在调用一个函数
foo(x,y0=y[0],y1=y[1],y2=y[2],...,y<d>=y[<d>])
其中<d> 是一个很大的数字,可能因呼叫而异。除 x 之外的所有参数都是关键字参数。
我自己没有写foo,所以我不能只是将y 作为列表传递。有没有一种自动的方法将列表拆分为关键字参数?
【问题讨论】:
首先,构建一个名称、值对的列表,然后将其转换为字典并将其传递给函数。
y_vals = [ 1, 2, 3, 'a', 'b', 'c' ]
arg_dict = dict(('y%d' % i, v) for i, v in enumerate(y_vals))
foo(x, **arg_dict)
【讨论】:
arg_dict = { 'y%d' % i: v for i, v in enumerate(y_vals)}
使用* 从列表中传递未打包的参数,您可以发送普通参数来代替关键字参数,只需确保以正确的顺序传递它们,例如:
def foo(x, y1=None, y2=None, y3=None, y4=None, ... , yN=None):
# func stuff
您可以将列表传递给函数解压,例如:
arguments = ["arg-y1", "arg-y2", "arg-y3", ... , "arg-yN"]
foo (x, *arguments)
由于它们是关键字参数,它们将具有一些默认值。
如果你只想传递几个特定的值,你可以使用Dictionary 和** for kw:
kwargs = {"y1": "arg-y1", "y3": "arg-Y3" }
foo (x, **kwargs)
【讨论】:
您可以使用**kwargs 让您的函数采用任意数量的关键字参数(“kwargs”表示“关键字参数”):
>>> def print_keyword_args(**kwargs):
... # kwargs is a dict of the keyword args passed to the function
... for key, value in kwargs.iteritems():
... print "%s = %s" % (key, value)
...
>>> print_keyword_args(first_name="John", last_name="Doe")
first_name = John
last_name = Doe
您还可以在调用函数时使用**kwargs 语法,方法是构造关键字参数字典并将其传递给您的函数:
>>> kwargs = {'first_name': 'Bobby', 'last_name': 'Smith'}
>>> print_keyword_args(**kwargs)
first_name = Bobby
last_name = Smith
Python Tutorial 很好地解释了它的工作原理,并附有一些很好的例子。
对于您将列表转换为关键字参数的情况:
# y is a list with arguments stored.
kwargs = {}
for arg in range(len(y)):
kwargs['y'+str(arg)] = y[arg]
foo(**kwargs)
【讨论】: