在python中使用参数列表调用函数

Sur*_*Din 144 python function

我试图在python中调用另一个函数内的函数,但找不到正确的语法.我想做的是这样的:

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])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第一个呼叫将起作用,第二个呼叫不起作用 我想要修改的是包装函数而不是被调用的函数.

its*_*dok 258

在其他答案上稍微扩展一下:

在线:

def wrapper(func, *args):
Run Code Online (Sandbox Code Playgroud)

*next args表示"获取给定的其余参数并将它们放入名为args" 的列表中.

在线:

    func(*args)
Run Code Online (Sandbox Code Playgroud)

这里的*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])
Run Code Online (Sandbox Code Playgroud)

wrapper2,列表是显式传递的,但在两个包装器中都args包含列表[1,2,3].

  • 我没有经常提到的一件事就是如果你想要传递一个列表或元组,如何使用*args调用函数.为此你需要像这样调用它:wrapper1(func2,*mylist) (26认同)
  • `args 旁边的 * 表示“将给定的其余参数放入一个名为 args 的列表中”。` 它将它们放在一个元组中,而不是一个列表中。 (2认同)

Ale*_*lex 18

包装函数的最简单方法

    func(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

...是手动编写一个在其自身内部调用func()的包装器:

    def wrapper(*args, **kwargs):
        # do something before
        try:
            return func(*a, **kwargs)
        finally:
            # do something after
Run Code Online (Sandbox Code Playgroud)

在Python中,函数是一个对象,因此您可以将其名称作为另一个函数的参数传递并返回它.您还可以为任何函数anyFunc()编写包装器生成器:

    def wrapperGenerator(anyFunc, *args, **kwargs):
        def wrapper(*args, **kwargs):
            try:
                # do something before
                return anyFunc(*args, **kwargs)
            finally:
                #do something after
        return wrapper
Run Code Online (Sandbox Code Playgroud)

还请注意,在Python中,当您不知道或不想命名函数的所有参数时,您可以引用一个参数元组,该元组由其名称表示,后面的括号中带有星号.功能名称:

    *args
Run Code Online (Sandbox Code Playgroud)

例如,您可以定义一个可以接受任意数量参数的函数:

    def testFunc(*args):
        print args    # prints the tuple of arguments
Run Code Online (Sandbox Code Playgroud)

Python提供了对函数参数的进一步操作.您可以允许函数获取关键字参数.在函数体内,关键字参数保存在字典中.在函数名称后面的括号中,此字典由两个星号表示,后跟字典名称:

    **kwargs
Run Code Online (Sandbox Code Playgroud)

打印关键字参数字典的类似示例:

    def testFunc(**kwargs):
        print kwargs    # prints the dictionary of keyword arguments
Run Code Online (Sandbox Code Playgroud)


Jim*_*imB 10

您可以对可变长度参数使用*args和**kwargs语法.

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

并从官方python教程

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


小智 10

您的问题的字面答案(完全按照您的要求进行操作,只更改包装器,而不是函数或函数调用)只是改变行

func(args)
Run Code Online (Sandbox Code Playgroud)

阅读

func(*args)
Run Code Online (Sandbox Code Playgroud)

这告诉Python采用给定的列表(在本例中args),并将其内容作为位置参数传递给函数.

这个技巧适用于函数调用的两个"边",因此定义如下的函数:

def func2(*args):
    return sum(args)
Run Code Online (Sandbox Code Playgroud)

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

我希望这有助于澄清一些事情.请注意,这也可以使用dicts/keyword参数,**而不是使用*.


Jor*_*ril 8

你需要使用参数解包..

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)
Run Code Online (Sandbox Code Playgroud)