繁体   English   中英

使用名为 arguments 从列表中调用 function

[英]Calling function from a list using named arguments

假设我有一个 function 调用及其各自的 arguments 的列表,类似于以下内容

def printStuff(val1, val2, val3, printGotHere=False, saveValsToFile=False):
    allVals = [val1, val2, val3]
    
    if printGotHere:
        print('Got Here!')
    
    for val in allVals:
        print(val)
    if saveValsToFile:
        with open('vals.text', 'w') as fp:
            for line in allVals:
                fp.write("%s\n" % str(line))

funcList = []
funcList.append({'func': printStuff, 'args': [1, 2, 3]})
funcList.append({'func': printStuff, 'args': [4, 5, 6]})
funcList.append({'func': printStuff, 'args': [7, 8, 9]})

for funcAndArgs in funcList:
    funcAndArgs['func'](*funcAndArgs['args'])

这很好用,但是假设我想指定一个名为 arguments 的名称,例如“saveValsToFile”,而不放置任何其他可选变量。 所以一个正常的函数调用看起来像printStuff(1, 2, 3, saveValsToFile=True) 如果我尝试将该命名变量放入上述方法的列表中,它会给出错误...但我不确定如何格式化,因此它知道将其视为命名变量。 所以我想做这样的事情

funcList.append({'func': printStuff, 'args': [1, 2, 3, saveValsToFile=True]})

我实际上是从 lambda 调用列表中的所有这些函数,这样我就可以向队列中添加一个线程,所以我必须创建一个助手 function 以便可以将多个参数传递给 ZC1C425268E683894F14AB57A。 不确定这是否会改变事情,但这就是我设置该部分的方式。

def customFunctionCall(funcArgDict):
    return funcArgDict['func'](*funcArgDict['args'])

threads = []
que = Queue()

for funcAndArgs in funcList:
    t = threading.Thread(target=lambda q, arg1: q.put(customFunctionCall(arg1)), args=(que, funcAndArgs))
    t.start()
    threads.append(t)

for t in threads:
    t.join()

while not que.empty():
    result = que.get()
    print(result)

您需要添加一个新的kwargs参数,该参数是关键字 arguments 的字典:

def printStuff(val1, val2, val3, printGotHere=False, saveValsToFile=False):
    allVals = [val1, val2, val3]
    
    if printGotHere:
        print('Got Here!')
    
    for val in allVals:
        print(val)
    if saveValsToFile:
        with open('vals.text', 'w') as fp:
            for line in allVals:
                fp.write("%s\n" % str(line))

funcList = []
funcList.append({'func': printStuff, 'args': [1, 2, 3]})
funcList.append({'func': printStuff, 'args': [4, 5, 6]})
funcList.append({'func': printStuff, 'args': [7, 8, 9], 'kwargs': {'printGotHere': True}})

for funcAndArgs in funcList:
    funcAndArgs['func'](*funcAndArgs['args'], **funcAndArgs.get('kwargs', {}))

运行上述结果:

1
2
3
4
5
6
Got Here!
7
8
9

一些相关文档在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM