2016-11-12 40 views
0

自动我打电话的功能如何通过大量的关键字参数在python

foo(x,y0=y[0],y1=y[1],y2=y[2],...,y<d>=y[<d>]) 

其中<d>是大量可从呼叫改变调用。除x外的所有参数都是关键字参数。 我自己并没有写foo,所以我不能仅仅将y作为列表。有没有一种自动的方式将列表分成关键字参数?

回答

4

首先,建立名称,值对的列表,然后将其转换成一个字典,并把它传递给功能。

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) 
+0

这可以更加简洁一点的字典理解:'arg_dict = { 'Y%d' %I:v对于I,V在枚举(y_vals)}' –

+0

正确。我的大脑的一部分仍然是2.5兼容的。 – cco

+0

这正是我所寻找的。美丽! – Bananach

0

使用*传递解压的参数从列表中,您可以在正常的参数发送代替关键字参数,只要确保你通过他们在正确的顺序,如:

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**

kwargs = {"y1": "arg-y1", "y3": "arg-Y3" } 
foo (x, **kwargs) 
1

您可以使用**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包含了一个很好expla它的工作原理以及一些很好的例子。

对于你的情况,以列表转换为关键字参数:

# y is a list with arguments stored. 
kwargs = {} 
for arg in range(len(y)): 
    kwargs['y'+str(arg)] = y[arg] 

foo(**kwargs)