打包功能参数

时间:2019-01-05 03:30:19

标签: python

我想调用一个在单个变量内发送多个参数的函数。

换句话说,我想做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 个答案:

答案 0 :(得分:2)

您必须使用运算符*解压缩参数:

Test(*tup)

顺便说一句,当您要按位置分配自变量时,将使用运算符*。如果要按名称分配自变量,则可以将运算符**与字典一起使用:

def foo(a, b):
    print(a, b)

kwargs = {'b': 20, 'a': 0}

foo(**kwargs) # 0 20

答案 1 :(得分:2)

您可以使用*运算符对元组或列表进行解压缩:

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,还可以用两个*来解开字典:

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}