代码之家  ›  专栏  ›  技术社区  ›  bad_coder Dima G

打包函数参数

  •  0
  • bad_coder Dima G  · 技术社区  · 6 年前

    我想调用一个函数,在一个变量内发送几个参数。

    换句话说,我想这样做 Test(some_var) 结果与 x1 在这个例子中。

    class Test:    
        def __init__(self, one, two=None):
            self.one = one
    
            if two is not None:
                self.two = two
    
    
    tup = 'a', 'b'
    lst = ['a', 'b']
    
    x1 = Test('a', 'b')
    x2 = Test(tup)
    x3 = Test(lst)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   iz_    6 年前

    你可以使用 * 用于解包元组或列表的运算符:

    class Test:
        def __init__(self, one, two=None):
            self.one = one
            if two is not None:
                self.two = two
    
    
    tup = 'a', 'b'
    lst = ['a', 'b']
    
    x1 = Test('a', 'b')
    x2 = Test(*tup) # unpack with *
    x3 = Test(*lst) # unpack with *
    print(vars(x1) == vars(x2) == vars(x3)) # True
    

    如果您有关键字参数和 dict ,您也可以用两个 * S:

    class Test:
        def __init__(self, one=None, two=None):
            self.one = one
            if two is not None:
                self.two = two
    
    kwargs = {'one': 'a', 'two': 'b'}
    
    x1 = Test('a', 'b')
    x2 = Test(**kwargs)
    print(vars(x1) == vars(x2)) # True
    

    here .

    解包操作符是非常通用的,它不仅仅用于函数参数。例如:

    >>> [*range(4), 4]
    [0, 1, 2, 3, 4]
    >>> {'x': 1, **{'y': 2}}
    {'x': 1, 'y': 2}
    
        2
  •  2
  •   JoshuaCS    6 年前

    必须使用运算符解包参数 * :

    Test(*tup)
    

    顺便问一下,接线员 * 在要分配时使用 按位置排列的参数 . 如果你想分配 按名称排列的参数 你可以用接线员 ** 在字典中:

    def foo(a, b):
        print(a, b)
    
    kwargs = {'b': 20, 'a': 0}
    
    foo(**kwargs) # 0 20