【问题标题】:Method that takes a method as a parameter with an optional parameter将方法作为参数和可选参数的方法
【发布时间】:2018-11-09 17:47:44
【问题描述】:

我有两个来自库的方法,它们以相同的方式工作。不同之处在于需要一个额外的可选参数。例如:

def method1(a, b, c):
    ...

def method2(a, b, c, d=None):
    ...

我必须对这些方法的结果执行相同的任务,所以我有一个组合它们的方法,如下所示:

def wrapper(method, a, b, c, d=None):

    ...

    if d:
        results = method(a, b, c, d=d)
    else:
        results = method(a, b, c)

    ...

这可行,但是当我添加更多具有不同可选参数的方法时,它变得很麻烦。有没有更好的方法来处理这些参数?

【问题讨论】:

  • 查看* 运算符以获得函数参数;我怀疑您可以通过简单的参数列表从那里解决您的问题,例如results = method(*arg_list)
  • 尝试**kwargs 的参数d
  • 这些是方法还是函数?但我同意,最好是修改方法/函数以有条件地处理 args/kwargs。
  • 在我的例子中,方法 1 和 2 实际上是方法,包装器是一个函数,但我试图概括这个例子。没想到*args整体可以通过。

标签: python methods optional-parameters


【解决方案1】:

这里有一些代码可以完成你正在寻找的东西。

您可以将一组方法传递给wrapper,该函数将返回关键字参数映射到kwargs 的任何方法的值。

def method1(a, b, c):
    return a, b, c


def method2(a, b, c, d=None):
    return a, b, c, d

methods = (
    method1,
    method2,
) # Collection of methods to run.

def wrapper(kwargs, methods=methods):
    """Loop over methods with kwargs."""
    for method in methods:
        try: # Call method with **kwargs
            return method(**kwargs) # Return value if keys in kwargs fit signature of method.
        except TypeError as err: # Handle error if keyword args don't match.
            print(f'err "{err}" for method "{method}')

kwargs_collection = (dict(zip(args, (f'value for arg: "{arg}"' for arg in args)))
                     for args in ('abcd', 'abc', ))




for test_kwargs in kwargs_collection:
    print(wrapper(test_kwargs))

输出

err "method1() got an unexpected keyword argument 'd'" for method "function method1 at 0x7f900c2b7d90"

('arg 值: "a"', 'arg 值: "b"', 'arg 值: "c"', 'arg 值: "d"')

('arg 值:"a"','arg 值:"b"','arg 值:"c"')

【讨论】:

    【解决方案2】:

    对于包装函数,我决定按照 cmets 中的建议执行以下操作:

    def wrapper(method, *args):
    
        ...
    
        results = method(*args)
    
        ...
    

    应结合错误处理以确保也传递了正确的参数,正如另一个答案中所建议的那样。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2012-09-25
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      相关资源
      最近更新 更多