在python中调用带参数列表的函数

2024-04-19 14:49:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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])

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


Tags: 函数returndef语法情况argswrapper事情
3条回答

对于可变长度参数,可以使用*args和**kwargs语法。

What do *args and **kwargs mean?

从官方的python教程

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

在其他答案上稍加扩展:

行中:

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中,列表被显式传递,但在两个包装器中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中,函数是一个对象,因此可以将它的名称作为另一个函数的参数传递并返回它。您还可以为任何函数编写包装生成器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

相关问题 更多 >