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

管理函数调用中的*参数差异

  •  3
  • kprobst  · 技术社区  · 15 年前

    具有具有以下签名的方法:

    def foo(self, bar, *uks):
        return other_method(..., uks)
    

    通常称为:

    instance.foo(1234, a, b, c, d)
    

    但是在某些情况下,我需要这样做:

    p = [a, b, c, d]
    instance.foo(1234, p)
    

    在接收端,这不起作用,因为 other_method 看到 *args 由单个列表对象而不是简单的 [a, b, c, d] 列表构造。如果我键入方法为:

    def foo(self, bar, uks = []):
        return other_method(..., uks)
    

    它起作用了,但每次我都被迫这样做:

    instance.foo(1234, [a, b, c, d])
    

    我想这没什么大不了的,但我只是想知道我是否错过了更多的蟒蛇式的方式?

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  3
  •   Pär Wieslander    15 年前

    蟒蛇支持 unpacking of argument lists 处理好这种情况。以下两个调用是等效的:

    定期呼叫:

    instance.foo(1234, a, b, c, d)
    

    参数列表扩展:

    p = [a, b, c, d]
    instance.foo(1234, *p)
    
        2
  •  2
  •   Alex Martelli    15 年前
    p = [a, b, c, d]
    instance.foo(1234, *p)
    

    这个 *p 形式是这里的关键部分——它的意思是“展开顺序” p 分成不同的位置参数。

        3
  •  1
  •   Ned Batchelder    15 年前

    我认为你这里的答案是正确的。下面是一个完整的例子:

    class MyObject(object):
        def foo(self, bar, *uks):
            return self.other_method(1, uks)
    
        def other_method(self, x, uks):
            print "uks is %r" % (uks,)
    
    # sample data...
    a, b, c, d = 'a', 'b', 'c', 'd'
    
    instance = MyObject()
    
    print "Called as separate arguments:"
    instance.foo(1234, a, b, c, d)
    
    print "Called as a list:"
    p = [a, b, c, d]
    instance.foo(1234, *p)
    

    运行时,将打印:

    Called as separate arguments:
    uks is ('a', 'b', 'c', 'd')
    Called as a list:
    uks is ('a', 'b', 'c', 'd')
    

    你对亚历克斯的回答说 ([a, b, c, d],) 但是我不知道怎么做。