【问题标题】:How to pass arguments to a function that itself is passed as a kwarg如何将参数传递给本身作为 kwarg 传递的函数
【发布时间】:2020-09-04 12:22:31
【问题描述】:

在下面的示例中,我尝试将参数传递给本身已作为 kwarg 传递的函数。在以下示例中,我未能成功地将参数从类“TestClass”中传递给函数“func”:

import sys, threading; from threading import Thread

def func(kwargs): 
    print('IN:', sys._getframe(0).f_code.co_name)
    for key, value in kwargs.items() :
        print ('KEY:', key, ', VAL:', value, sep='')

class TestClass(Thread):
    
    def __init__(self, name = sys._getframe(0).f_code.co_name, kwargs = None):
        Thread.__init__(self)
        self.name = name
        self.kwargs = kwargs
        print('IN:', self.name)
        
    def run(self):
        func = self.kwargs['func']        
        func_kwargs_inner = {'arg_1': 'INNER-1', 'arg_2': 'INNER-2'}        
        func()  # how to pass func_kwargs_inner to func?
        
def main():
    func_kwargs = {'arg_1': 'OUTER-1', 'arg_2': 'OUTER-2'}  # these get passed
#     func_kwargs = {}  # func_kwargs never gets populated
    kwargs = {'func': (lambda: func(func_kwargs))}    
    test = TestClass(name='my-test', kwargs=kwargs)
    test.start()
    print('PROGRAM END')
    
if __name__ == '__main__':
    main()

如果我尝试将“func_kwargs_inner”传递给“func()”,则会出现语法错误;如果我将参数列表留空 - 如示例所示 - 结果是:

IN: my-test
IN: func
KEY:arg_1, VAL:OUTER-1
KEY:arg_2, VAL:OUTER-2
PROGRAM END

而一旦我找到正确传递参数的方法,所需的输出是:

IN: my-test
IN: func
KEY:arg_1, VAL:INNER-1
KEY:arg_2, VAL:INNER-2
PROGRAM END

如何将 'func_kwargs_inner' 传递给 'func()'?

【问题讨论】:

    标签: python function keyword-argument


    【解决方案1】:

    看来,如果你做了显而易见的事情,那么它就会起作用,并且你的代码目前明确地避免传递你想要的参数。具体来说,在您的 TestClass.run 中,您没有将任何参数传递给 func,而是依赖于硬编码到 lambda 表达式中的函数参数。所以换行:

            func()  # how to pass func_kwargs_inner to func?
    

    传递参数:

            func(func_kwargs_inner)
    

    然后在main 中,而不是那个lambda 表达式:

        kwargs = {'func': (lambda: func(func_kwargs))}    
    

    只需传递函数对象本身:

        kwargs = {'func': func}    
    

    然后你得到预期的输出:

    IN: my-test
    IN: func
    PROGRAM END
    KEY:arg_1, VAL:INNER-1
    KEY:arg_2, VAL:INNER-2
    

    【讨论】:

    • 谢谢!我使用 lambda 表达式来防止“func”在我需要将可变数量的函数和可变数量的参数传递给类的情况下立即执行。在这种特殊情况下,这不是必需的,我现在看到您更简单的解决方案就是所需要的。
    猜你喜欢
    • 2013-01-27
    • 2021-04-13
    • 2021-11-20
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多