【问题标题】:How to pass all element of a list as parameter of a function without passing the list as argument如何将列表的所有元素作为函数的参数传递而不将列表作为参数传递
【发布时间】:2022-01-02 00:04:59
【问题描述】:

这是一个例子:

def testB(argA, argB):
    #USER CODE

def testA(argA, argB, argC):
    #USER CODE


def funcExecuter(func, nbArgs, *argv):
    #TODO


funcExecuter(testA, 3, 1, 2, 3)
funcExecuter(testB, 2, 1, 2)

我想实现一个函数(这里是 funcExecuter),它使用 argv 中的参数执行函数 func。那些函数有未定义数量的参数。 但我不能打电话

func(*argv)

导致实际函数testA,需要三个参数不是一个。 所以我需要使用 argv list 来调用函数 func 及其所有参数。

这可能吗? 最好的问候。

【问题讨论】:

    标签: python list function parameters arguments


    【解决方案1】:

    看起来你做的是正确的方法。

    例子:

    def testB(argA, argB):
        print(f'{argA=}')
        print(f'{argB=}')
    
    def testA(argA, argB, argC):
        print(f'{argA=}')
        print(f'{argB=}')
        print(f'{argC=}')
    
    def funcExecuter(func, nbArgs, *argv):
        return func(*argv)
    
    print('test1')
    funcExecuter(testA, 3, 'a', 'b', 'c')
    print('test2')
    funcExecuter(testB, 2, 'a', 'b')
    

    输出:

    test1
    argA='a'
    argB='b'
    argC='c'
    test2
    argA='a'
    argB='b'
    

    确保参数数量正确

    如果要截断或填充参数:

    def testA(argA, argB, argC):
        print(f'{argA=}')
        print(f'{argB=}')
        print(f'{argC=}')
    
    def funcExecuter(func, nbArgs, *argv):
        return func(*(list(argv[:nbArgs])+[None]*(nbArgs-len(argv))))
    
    print('test1')
    funcExecuter(testA, 3, 'a', 'b', 'c')
    print('test2')
    funcExecuter(testA, 3, 'a', 'b', 'c', 'd')
    print('test3')
    funcExecuter(testA, 3, 'a', 'b')
    

    输出:

    test1
    argA='a'
    argB='b'
    argC='c'
    test2
    argA='a'
    argB='b'
    argC='c'
    test3
    argA='a'
    argB='b'
    argC=None
    

    注意。这是一个简单的例子,当然你可以有更复杂的检查

    【讨论】:

      【解决方案2】:

      你为什么不使用func(*argv),如果它们传递的参数少于 3 个就抛出异常?

      【讨论】: