【问题标题】:Dynamic Python function parameter rerouting动态 Python 函数参数重新路由
【发布时间】:2019-12-03 10:38:17
【问题描述】:

我有一个python函数

func(a, b, c, d, e).

我想将此函数传递给另一个对其求值的函数。需要注意的是,这个其他函数仅改变参数(a, b, c, d, e) 的任意子集,并且其他参数应预加载一个常量。参数顺序也可能发生变化。

例如:我希望 func_2 改变 a、c 和 d,而 b=3 和 e=4。所以我需要一个例程

def convert(func, variables=[3, 0, 2], constants=[1, 4], vals=[3, 4]):
    ...
    python magic
    ...
    return func_2

转换:

func(a, b, c, d, e) -> func_2(d, a, c, b=3, e=4),

所以当我打电话给func_2(1, 2, 3)时,实际上在后台调用的是func(2, 3, 3, 1, 4)

(这是一种优化算法,对参数空间的子空间进行操作,这些子空间可以从一个循环到另一个循环。func 是一个成本函数。)

如何在 Python 3 中编码convert

【问题讨论】:

  • 为什么需要这个功能?每次需要“转换”的时候写func_2 = lambda d,a,c: func(a,3,c,d,4)不是更容易吗?
  • 对于这个例子,这正是我所需要的,但是关联和值会在一个循环中改变。所以我需要使 lambda 表达式动态化。正如我试图在我的帖子中表达的那样,我使用列表定义变量和常量顺序以及常量值。根据一次迭代的优化结果,我在下一次迭代中必须工作的子空间会发生变化。
  • 在一般情况下,您需要构造一个参数列表/元组,然后使用扩展语法将它们传递给函数。
  • convert 究竟返回了什么?可调用函数?一个字符串?
  • 一个可调用的函数。

标签: python-3.x function dynamic arguments


【解决方案1】:

这行得通:

def convert(func, vars, fixed):
    # vars: list of indices
    # fixed: dictionary mapping indices to constants
    n = len(vars) + len(fixed)
    def func_2(*args):
        newargs = [None] * n
        for i, j in enumerate(vars):
            newargs[j] = args[i]
        for k in fixed:
            newargs[k] = fixed[k]
        return func(*newargs)
    return func_2

【讨论】:

    【解决方案2】:

    这里有一个可能的解决方案:

    def convert(func, var, const, vals):
        def func2(*args):
            params = [args[var.index(i)] if i in var
                      else vals[const.index(i)]
                      for i in range(len(var)+len(const))]
            return func(*params)
        return func2
    

    它适用于任意数量的参数

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2021-08-12
      • 1970-01-01
      • 2015-09-01
      • 2023-04-11
      • 2019-05-24
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多