我什么时候使用 **kwargs vs kwargs (*args vs args)?
When do I use **kwargs vs kwargs (*args vs args)?
我需要将 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
表示a
和b
之后的参数不需要,像'non-named'一样传递参数 (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})
将尝试传递两个名为 foo
的参数和 bar
,函数 foo
.
的值分别为 5
和 6
我需要将 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
表示a
和b
之后的参数不需要,像'non-named'一样传递参数 (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})
将尝试传递两个名为 foo
的参数和 bar
,函数 foo
.
5
和 6