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
以便它可以按原样调用(使用两个输入 a
和 b
),而且与 baz
一起使用,这可能涉及将单个输入元组扩展到函数参数 a
和 b
?
这是对简单包装函数的一次尝试 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
我有一个 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
以便它可以按原样调用(使用两个输入 a
和 b
),而且与 baz
一起使用,这可能涉及将单个输入元组扩展到函数参数 a
和 b
?
这是对简单包装函数的一次尝试 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