在python中用参数列表调用一个函数

我试图调用Python中的另一个函数内的函数,但无法find正确的语法。 我想要做的是这样的:

def wrapper(func, args): func(args) def func1(x): print(x) def func2(x, y, z): return x+y+z wrapper(func1, [x]) wrapper(func2, [x, y, z]) 

在这种情况下,第一个电话将工作,第二个不会。 我想要修改的是包装函数,而不是被调用的函数。

在其他答案上扩大一点:

在该行中:

 def wrapper(func, *args): 

args旁边的*表示“把剩下的参数放在一个名为args的列表中”。

在该行中:

  func(*args) 

args旁边的*表示“把这个列表称为args,并且将其解包到剩下的参数中。

所以你可以做到以下几点:

 def wrapper1(func, *args): # with star func(*args) def wrapper2(func, args): # without star func(*args) def func2(x, y, z): print x+y+z wrapper1(func2, 1, 2, 3) wrapper2(func2, [1, 2, 3]) 

wrapper2 ,列表显式传递,但是在两个wrappers中, args包含列表[1,2,3]

最简单的方式来包装一个函数

  func(*args, **kwargs) 

…是手动编写一个可以在其内部调用func()的包装器:

  def wrapper(*args, **kwargs): # do something before try: return func(*a, **kwargs) finally: # do something after 

在Python中,函数是一个对象,所以你可以将它的名字作为另一个函数的parameter passing并返回。 您还可以为任何函数anyFunc()编写一个包装生成器:

  def wrapperGenerator(anyFunc, *args, **kwargs): def wrapper(*args, **kwargs): try: # do something before return anyFunc(*args, **kwargs) finally: #do something after return wrapper 

还请注意,在Python中,如果您不知道或不想指定函数的所有参数,则可以引用一个参数元组,在其函数后面的括号中以星号开头,前面加星号名称:

  *args 

例如,你可以定义一个函数来获取任意数量的参数:

  def testFunc(*args): print args # prints the tuple of arguments 

Python甚至可以在函数参数上进行更多的操作。 你可以允许一个函数采取关键字参数。 在函数体内,关键字参数被保存在一个字典中。 在圆括号中,函数名称这个字典用两个星号表示,后面跟着字典的名字:

  **kwargs 

一个类似的例子,打印关键字参数字典:

  def testFunc(**kwargs): print kwargs # prints the dictionary of keyword arguments 

您可以将* args和** kwargs语法用于可变长度参数。

* args和** kwargs是什么意思?

从官方的python教程

http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions

你需要使用参数解包

 def wrapper(func, *args): func(*args) def func1(x): print(x) def func2(x, y, z): print x+y+z wrapper(func1, 1) wrapper(func2, 1, 2, 3) 

对你的问题的字面上的回答(完全是你所要求的,只改变包装,而不是函数或函数调用)只是改变行

 func(args) 

读书

 func(*args) 

这告诉Python获取给定的列表(在本例中为args ),并将其内容作为位置parameter passing给函数。

这个技巧在函数调用的两个方面都起作用,所以定义如下的函数:

 def func2(*args): return sum(args) 

将能够接受尽可能多的位置参数,并将它们全部放入一个名为args的列表中。

我希望这有助于澄清一些事情。 请注意,这也是所有可能的字典/关键字参数,使用**而不是*

除了之前的答案之外,由于找不到解决问题的方法,这不值得开一个新的问题,而是把我带到了这里。

这里是一个小的代码片断,它结合了listszip()*args ,提供了一个包装器,可以处理未知数量的函数和未知数量的参数。

 def f1(var1, var2, var3): print(var1+var2+var3) def f2(var1, var2): print(var1*var2) def f3(): print('f3, empty') def wrapper(a,b, func_list, arg_list): print(a) for f,var in zip(func_list,arg_list): f(*var) print(b) f_list = [f1, f2, f3] a_list = [[1,2,3], [4,5], []] wrapper('begin', 'end', f_list, a_list) 

请记住, zip()不提供一个不等长的列表的安全检查,请参阅在python中声明相等长度的zip迭代器 。