【问题标题】:passing functions and its arguments to another function将函数及其参数传递给另一个函数
【发布时间】:2017-11-03 18:59:25
【问题描述】:

我有子函数的树类型:

  • 一个没有任何参数(参数),
  • 一个参数秒
  • 第三个有多个参数(元组)

我正在尝试将该函数及其参数传递给另一个函数,该函数对所有子函数的结果求和并返回总和值。 该函数中的参数应该是:每个子函数的名称作为位置参数 (*args),每个子函数的参数作为键值参数 (*kvargs)。

示例

 def no_arg()
 def one_arg(a)
 def multiple_args(a, b, c, e, f)

 # execution of function_results_sum:
 function_results_sum(
     no_arg, one_arg, multiple_args,
     one_arg=23,
     multiple_args=(1, 2, 3, 4, 5))

到目前为止我做了什么:

def no_arg():
    return 5

def ident(x):
    return x

def mult(x, y):
    return x * y    

def function_results_sum(*args, **kwargs):
        return no_arg() + ident(kwargs[ident.__name__]) + mult(*kwargs[mult.__name__])   

上面的代码将参数传递给每个子函数,但是子函数名称是硬编码的。我想修改当前代码以便能够从 *args 获取函数名称。下面我写了一个伪代码来表达我想要实现的目标:

def function_results_sum(*args, **kwargs):
    for functionName in args:
        result = sum(funcionName(kwargs))
    return result

我已经花了一整天的时间来解决这个问题,所以请不要写信告诉我“使用 google 不会造成伤害” ;)

【问题讨论】:

  • 它是否总是三个函数,每个类型之一?请注意,如果您不在 Python 3.6 上,您想要的签名可能会很棘手,否则,无法保证 kwargs 的顺序。
  • 我使用的是 Python 3.6。顺序始终相同。

标签: python function args keyword-argument


【解决方案1】:

这样的事情会起作用:

def no_arg():
    return 5

def one_arg(x):
    return x

def multiple_args(x, y):
    return x * y

def function_results_sum(*args, **kwargs):
    result = 0
    for func in args:
            result += func(*kwargs[func.__name__])
    return result

输出:

function_results_sum(
    no_arg, one_arg, multiple_args,
    no_arg=(),
    one_arg=(23, ),
    multiple_args=(1,5))

33

您所要求的唯一区别是您必须将 args 放入一个元组中,然后解压缩为 args 以便稍后传入。

如果你不想为没有参数的函数提供任何东西,你可以仔细检查函数名称是否在 kwargs 中:

def function_results_sum(*args, **kwargs):
    result = 0
    for func in args:
        if func.__name__ i kwargs:
            result += func(*kwargs[func.__name__])
        else:
            result += func()
    return result

【讨论】:

  • 非常感谢!这正是我所需要的!
【解决方案2】:

R Nar 的帖子正是我试图实现的目标。我添加了额外的 if 语句来验证 kwarg 是整数还是元组。感谢您不必将所有 **kwargs 放在一个元组中。谢谢大家帮忙!

def function_results_sum(*args, **kwargs):
    result = 0
    for func in args:
        if func.__name__ in kwargs:
            if type(kwargs[func.__name__]) == int:
                result += func(kwargs[func.__name__])
            elif type(kwargs[func.__name__]) == tuple:
                result += func(*kwargs[func.__name__])
        else:
            result += func()
    return result

result = function_results_sum(no_arg, ident, mult, ident=2, mult=(3, 4))
print(result)

【讨论】:

    【解决方案3】:

    通过谷歌'python确定传递函数的参数数量'我找到了How can I find the number of arguments of a Python function?

    我很确定您不想要 **kwars 键值语法,所以我使用 func_list 常规 arg 和 *args

    from inspect import signature
    
    
    def function_results_sum(func_list, *args):
    
        arg_gen = (e for e in args)
    
        return sum([func(*(next(arg_gen)
                           for _ in range(len(signature(func).parameters))))
                   for func in func_list])
    
    function_results_sum([no_arg, ident, mult], 7,8,9)
    84  
    

    可以通过将 *args 解析为 Functions 和(假定的)参数(任何非类型 Function)来使输入更平坦

    from inspect import signature
    import types
    
    
    def function_results_sum(*args):
    
        func_gen = (e for e in args if isinstance(e, types.FunctionType))
    
        arg_gen = (e for e in args if not isinstance(e, types.FunctionType))
    
        return sum(func(*(next(arg_gen)
                           for _ in range(len(signature(func).parameters))))
                   for func in func_gen)
    
    function_results_sum(no_arg, ident, mult, 10,6,90)
    555
    

    函数的顺序和参数的顺序很重要,但可以分开交错:

    function_results_sum(no_arg, 10, ident, 6, 90, mult)
    Out[399]: 555
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2020-10-03
      • 2014-01-06
      • 2019-10-09
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多