Python 方法,该方法将方法作为带有可选参数的参数

Python 方法,该方法将方法作为带有可选参数的参数,python,methods,optional-parameters,Python,Methods,Optional Parameters,我从一个库中得到了两种方法,它们以相同的方式工作。不同之处在于,我们需要一个额外的可选参数。例如: 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

我从一个库中得到了两种方法,它们以相同的方式工作。不同之处在于,我们需要一个额外的可选参数。例如:

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)

    ...

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

以下是一些代码,它们可能会完成您想要的功能

您可以将一组方法传递到
包装器
,该函数将返回任何方法的值,该方法的关键字参数映射到
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))
输出

错误“method1()在0x7f900c2b7d90处获取了方法“函数method1”的意外关键字参数“d”

(‘参数值:“a”’、‘参数值:“b”’、‘参数值:“c”’、‘参数值:“d”’)

(‘参数值:“a”’、‘参数值:“b”’、‘参数值:“c”’)


对于包装器函数,我决定按照注释中的建议执行如下操作:

def wrapper(method, *args):

    ...

    results = method(*args)

    ...

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

查看函数参数的
*
运算符;我猜想您可以通过一个简单的参数列表来解决您的问题,例如
results=method(*arg_list)
尝试
**kwargs
参数
d
。这些是方法还是函数?但是我同意,如果您修改方法/函数以有条件地处理args/kwargs,可能是最好的。在我的例子中,方法1和2实际上是方法,包装器是一个函数,但是我试图对这个例子进行概括。我没有意识到,
*args
作为一个整体可以被传递。