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

标签 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)

    ...

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

最佳答案

这里有一些代码可以实现您正在寻找的内容。

您可以将方法集合传递到 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"

('value for arg: "a"', 'value for arg: "b"', 'value for arg: "c"', 'value for arg: "d"')

('value for arg: "a"', 'value for arg: "b"', 'value for arg: "c"')

关于python - 将方法作为带有可选参数的参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53230895/

相关文章:

python - 上传前在本地进行一些处理

objective-c - 通过通用方法传递不同的 UIButton。选择器/发送器是答案吗?

smalltalk - 我如何使用 Smalltalk 的内置解析器或编译器来解析我自己的带有可选参数的消息?

java - 使用许多可选参数有效地重载函数

swift - 如何在 swift 中创建一个可选的闭包?

python - if语句中 "in"的用法和含义?

python - Kivy:解析行为

python - tkinter 列表框和标签位置

java - Java中定义了main函数的类可以创建对象吗?

java - 为什么即使编辑文本为空白也可以运行此方法?