首页 文章

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

提问于
浏览
129

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

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

6 回答

  • 10

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

    在线:

    def wrapper(func, *args):
    

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

    在线:

    func(*args)
    

    args 旁边的*表示“将此列表称为args,'unwrap'将其放入其余参数中 .

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

    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] .

  • 0

    包装函数的最简单方法

    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
    
  • 8

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

    What do *args and **kwargs mean?

    并从官方python教程

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

  • 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)
    
  • 239

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

    func(args)
    

    阅读

    func(*args)
    

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

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

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

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

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

  • 16

    以前答案的一小部分,因为我找不到问题的解决方案,这不值得开一个新问题,但引导我来到这里 .

    这是一个小代码片段,它结合了 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() 不对长度不等的列表提供安全检查,请参阅zip iterators asserting for equal length in python .

相关问题