正如标题所述,我正在尝试创建一个将任何数量的函数作为参数(包括它们的参数)的函数。然后,它将采用这些功能并将其输出到准备执行的列表中,而无需事先执行任何功能。
到目前为止,这是我的尝试:
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)
答案 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()