代码之家  ›  专栏  ›  技术社区  ›  exupero

python列表为*args?

  •  3
  • exupero  · 技术社区  · 16 年前

    我有两个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)) 或有 函数1 检查是否 args[0] 是一张单子。不幸的是,我不能在这个特定的实例中使用第一个解决方案,要应用第二个解决方案,需要在许多地方执行这样的检查(在 函数1 )

    有人知道怎么做吗?我想有些内省可以用,但我可能错了。

    3 回复  |  直到 16 年前
        1
  •  3
  •   PabloG    16 年前

    你可以使用雅罗斯拉夫发布的装饰。

    最小示例:

    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)
    
        2
  •  4
  •   Yaroslav    16 年前

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

        3
  •  1
  •   Esteban Küber    16 年前

    通常,我会用 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))) (但你不需要)。