我如何通过一个函数传递多个函数(带有附加参数)并在不执行它们的情况下将它们输出为函数列表

时间:2018-07-18 06:04:42

标签: python algorithm function

正如标题所述,我正在尝试创建一个将任何数量的函数作为参数(包括它们的参数)的函数。然后,它将采用这些功能并将其输出到准备执行的列表中,而无需事先执行任何功能。

到目前为止,这是我的尝试:

def fxn1(name, employment_status="Working"):
    return name, employement_status

def fxn2(age, job=None):
    return age, job

def output_funcs(**funcs_with_args):
    uncalled_function_list = []
    for function in funcs_with_args:
        params_list = function.__code__.co_varnames
        function_args = []
        for parameter in range(len(params_list)):
            arg = funcs_with_args[function][parameter - 1]
            function_args.append(arg)
        uncalled_function_list.append(function(function_args))
    return uncalled_function_list

output_funcs(fxn1 = {"name" : "joe", "employment_status" : "coder"}, fxn2 = {"age" : 12, "job" : "farmer"})

任何指导将不胜感激。

理想情况下,输出应为:

fxn1('joe', 'coder'), fxn2(12, 'farmer')

编辑

我现在实际上已经可以正确输出该函数,但是由于它们以字符串形式输出(请参见下面的代码),所以我无法调用该函数:

def fxn1(name, employment_status ="Working"):
    print("hi")

def fxn2(age, job=None):
    print("hello")

def output_funcs(**funcs_with_args):
    uncalled_function_list = []
    for function in funcs_with_args["function_list"]:
        fxn_string = str(function).split(" ")
        fxn_name = fxn_string[1]
        params_list = function.__code__.co_varnames
        function_args = []
        for parameter in params_list:
            arg = funcs_with_args["args"][fxn_name][parameter]
            function_args.append(arg)
        uncalled_function_list.append(f"{function}({function_args[0]}, {function_args[1]})")
    return uncalled_function_list


funcs_yo = output_funcs(function_list = [fxn1, fxn2],
             args = {"fxn1" : {"name" : "joe",
                          "employment_status" : "coder"},
                     "fxn2" : {"age" : 12,
                          "job" : "farmer"}})

for func in funcs_yo:
    print(func)

1 个答案:

答案 0 :(得分:1)

如果我正确理解,则可能要使用functools.partial

我略微更改了输入以接受任意数量的(function, kwarg)参数。如果要专门传递两个参数(fxn1,fxn2),则可以使用kwargs分配(类型错误来自何处)。为了传递任意数量的函数,您需要在function_collector中使用*args而不是**kwargs

def function_collector(*func_kwarg_pairs):
    ready_to_call = []
    for func, kwargs in func_kwarg_pairs:
        new_function = partial(func, **kwargs)
        ready_to_call.append(new_function)
    return ready_to_call
    # as a one-line func: return [partial(func, *kwargs) for func, kwargs in func_kwarg_pairs]

# with your two funcs:
if __name__ == '__main__':
    pairs = [(fxn1, {"name" : "joe", "employment_status" : "coder"}), (fxn2, {"age" : 12, "job" : "farmer"})]
    to_be_called = function_collector(*pairs)
    for item in to_be_called:
        item()