编程语言
首页 > 编程语言> > Python列表为* args?

Python列表为* args?

作者:互联网

我有两个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)中) – 但我不希望func1中的args为([6,7,8],)我想要它是(6,7,8),好像它被称为func1(6,7,8),而不是func1([6,7,8]).

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

有人知道怎么做吗?我想可以使用某种内省,但我可能是错的.

解决方法:

您可以使用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)

标签:function-composition,python
来源: https://codeday.me/bug/20190726/1546468.html