我什么时候使用** kwargs vs kwargs(* args vs args)?

时间:2016-11-12 16:11:31

标签: python python-3.x dereference args kwargs

我需要存储args和amp;元组中的kwargs稍后调用,所以在这种情况下,元组* args或args中的值是否合适?换句话说,这会起作用吗?

def __init__(self, *args, **kwargs):
    self._buildCalls = [
        (self.__init__, args, kwargs)
    ]
    self._building = False

def __getattr__(self, attr):
    if self.building():
        if hasmethod(self, attr):
            return lambda *args, **kwargs: self.argSaver(attr, *args, **kwargs)
    else:
        return super().__getattr__(attr)

def argSaver(self, method, *args, **kwargs):
    self._buildCalls.append((method, args, kwargs))
    return method(*args, **kwargs)

1 个答案:

答案 0 :(得分:8)

这是一个示例函数签名:

def foo(a, b, *args, **kwargs):

此处*args 代表 ab之后不需要的参数,像“非命名”参数一样传递({{1这个函数将它们作为一个名为foo(1, 2, 3, 4, 5)的元组来获取:args

args == (3, 4, 5)表示不需要的参数,按名称(**kwargs)传递,函数将其作为名为foo(1, 2, foo=3, bar=4)的字典获取:kwargs。< / p>

当您在函数定义之外使用星号表示法时,它会尝试从元组或字典中提取数据,例如kwargs == {'foo': 3, 'bar': 4}为您提供了三个从元组中提取的单独值,*(1, 2, 3)将提取字典的所有键,但*{'foo': 5}将尝试传递两个名为foo(**{'foo': 5, 'bar': 6})的参数和foo分别为bar5 6功能{/ 1}}。