3

我有两个 Python 函数,它们都在函数定义中采用可变参数。举一个简单的例子:

def func1(*args):
    for arg in args:
        print arg

def func2(*args):
    return [2 * arg for arg in args]

我 想 组合 它们 —— 就像func1(func2(3, 4, 5))—— 但 我 不想args成为, 我 想要 它 是func1,好像 它 被 称为而 不是.([6, 7, 8],)(6, 7, 8)func1(6, 7, 8)func1([6, 7, 8])

通常,我会使用func1(*func2(3, 4, 5))func1检查是否args[0]是一个列表。不幸的是,我不能在这个特定的实例中使用第一个解决方案,而应用第二个解决方案需要在很多地方进行这样的检查(角色中有很多功能func1)。

有谁知道如何做到这一点?我想可以使用某种内省,但我可能是错的。

4

3 回答 3

4

您可以考虑编写函数装饰器来检查第一个参数是否是列表。将装饰器应用于现有函数比修改函数要简单一些。

于 2010-04-05T21:27:50.417 回答
3

您可以使用 Yaroslav 发布的装饰器。

最小的例子:

def unpack_args(func):
    def deco_func(*args):
        if isinstance(args, tuple):
            args = args[0]

        return func(*args)

    return deco_func


def func1(*args):
    return args

def func2(*args):
    return args

@unpack_args
def func3(*args):
    return args

print func1(1,2,3)    # > (1,2,3)
print func2(1,2,3)    # > (1,2,3)
print func1(*func2(1,2,3))    # > (1,2,3)
print func1(func2(1,2,3))    # > ( (1,2,3), )
print func3(func2(1,2,3))   # > (1,2,3)
于 2010-04-06T02:18:53.613 回答
1

通常,我会使用func1(*func2(3, 4, 5))或让 func1 检查是否args[0]list. 不幸的是,我不能在这个特定的实例中使用第一个解决方案,而应用第二个解决方案需要在很多地方进行这样的检查(角色中有很多功能func1)。

为什么你不能使用第一个解决方案?

>>> def func1(*args):
    for arg in args:
        print arg

>>> def func2(*args):
    return [2 * arg for arg in args]

>>> func2(3, 4, 5)
[6, 8, 10]
>>> func1(1,2,3)
1
2
3
>>> func1(*func2(3, 4, 5))
6
8
10
>>> 

如果那不可能,您仍然可以使用func1(*tuple(func2(3, 4, 5)))(但您不需要)。

于 2010-04-05T21:28:12.320 回答