将方法作为参数并带有可选参数的方法

时间:2018-11-09 17:47:45

标签: 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, c, d=d)
    else:
        results = method(a, b, c)

    ...

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

2 个答案:

答案 0 :(得分: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))

输出

  

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

     

(''arg的值:“ a”','arg的值:“ b”','arg的值:“ c”','arg的值:“ d”')

     

(''arg的值:“ a”','arg的值:“ b”','arg的值:“ c”')

答案 1 :(得分:0)

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

def wrapper(method, *args):

    ...

    results = method(*args)

    ...

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