【问题标题】:Python list as *args?Python 列表作为 *args?
【发布时间】:2010-04-05 21:15:19
【问题描述】:

我有两个 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 的角色有很多功能)。

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

【问题讨论】:

  • "I can't use the first solution in this particular instance" 为什么不呢?
  • 我正在使用一个解析器,它调用 Python 函数但不支持在语法中解包。

标签: python function-composition


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为 OP 具​​有返回标量值的函数,而不仅仅是元组或列表。将它们全部转换为通用标准太昂贵了。
      猜你喜欢
      • 2013-03-07
      • 2020-05-25
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多