Python3: 参数的条件扩展

Python3: conditional expanding of arguments

我有一个 class 方法 bar 接受定义数量的参数:

class Foo:
    
    def bar(self, a: int, b: int):
        return a + b

编辑:

我的目标是借助来自第三方模块的函数(我们称之为 baz)将此函数映射到集群上。

baz 函数将在集群上并行执行 bar。它需要一个函数和一个可迭代的参数作为函数输入:

def baz(func: Any,
        its: Iterable[Any]):
    ...

本质上执行 (func(x) for x in its) 但在集群上并行执行。

问题是,在执行时,它从可迭代对象中获取恰好一个参数,并将其传递给提供的函数。作为第三方功能,除了将其放入我的代码库并进行更改之外,我无法修改它。

我的问题是,我怎样才能最好地修改/包装/装饰 bar 以便它可以按原样调用(使用两个输入 ab),而且与 baz 一起使用,这可能涉及将单个输入元组扩展到函数参数 ab?

这是对简单包装函数的一次尝试 biz:

class Foo:
    
    def bar(self, a: int, b: int):
        return a + b
    
    def biz(self, *args):
        
        if len(args) == 1:
            args, = args
        
        return self.bar(*args)

符合预期但似乎有点粗糙。也可能令人困惑且不稳健......

最后我决定使用装饰器,它可以很好地处理 IMO 的要求:

from functools import wraps

class Foo:

    def maybe_expand(func):
        """decorator to expand args if needed"""
        @wraps(func)
        def wrapped(inst, *args):
            if len(args) == 1 and isinstance(args[0], tuple):
                args, = args
            return func(inst, *args)
        return wrapped
    
    @maybe_expand
    def bar(self, a: int, b: int):
        return a + b

foo = Foo()

print(foo.bar(1,2))
# 3

print(foo.bar((1,2)))
# 3