我需要将 args 和 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)

最佳答案

这是一个示例函数签名:

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

这里 *args 表示在 ab 之后不需要的参数,像“非命名”参数( foo(1, 2, 3, 4, 5) )一样传递,函数将它们作为称为 args : args == (3, 4, 5) 的元组获取。
**kwargs 表示不需要的参数,通过名称 ( foo(1, 2, foo=3, bar=4) ) 传递,函数将它们作为名为 kwargs : kwargs == {'foo': 3, 'bar': 4} 的字典获取。

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

关于python - 我什么时候使用 **kwargs vs kwargs (*args vs args)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40564841/

10-12 22:41