如何通过Python参数和kwargs?
虽然我对Python的*args和**kwargs有一个大致的理解(我想),但我很难理解如何将它们从一个函数传递到另一个函数。这是我的模型:如何通过Python参数和kwargs?,python,Python,虽然我对Python的*args和**kwargs有一个大致的理解(我想),但我很难理解如何将它们从一个函数传递到另一个函数。这是我的模型: from pdb import set_trace as debug from django.db import models class Person(models.Model): name = models.CharField(max_length=30) def __unicode__(self): return
from pdb import set_trace as debug
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return u'%s' % self.name
def save_name_for(self, *args, **kwargs):
self.name = 'Alex'
return self
def save_name(self, *args, **kwargs):
debug()
self.save_name_for(self, args, kwargs)
self.save()
我已将保存名称拆分为上面的两个函数。通过这种方式,我可以通过单元测试save_name_for方法来测试我通常将所有逻辑都放在save_name方法中的逻辑
当我在解释器中运行它并在save_name方法中停止时,正如我所期望的那样,我看到:
(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}
(Pdb) args
self =
args = (<Person: >, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs =
如果我随后进入save_name_for方法,我会看到:
(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}
(Pdb) args
self =
args = (<Person: >, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs =
。。。但它似乎不起作用。args[2]就是一切(我不明白这一点)。有没有类似python的方法可以做到这一点?通过语法镜像参数语法传递它们:
self.save_name_for(*args, **kwargs)
请注意,您不需要传入
self
<代码>为保存名称已绑定。在两种不同的情况下使用*
和**
运算符
def save_name_for(self, *args, **kwargs):
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}
self.save_name_for(*args, **kwargs)
它用于表示任意数量的位置或关键字
分别是论点。要记住的一点是,在
函数args
将是一个元组,而kwargs
将是一个
dictdef save_name_for(self, *args, **kwargs):
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}
self.save_name_for(*args, **kwargs)
*
和***
充当拆包操作员args
必须是
iterable和kwargs必须是dict-like。args
将被解包并作为位置参数发送到函数,
kwargs
中的键/值对将作为
关键字参数。因此,
self.save_name_for(*args, **kwargs)
相当于
self.save_name_for(1, 2, last='Doe', first='John')
另请参阅,以获得示例解释。如果有人感兴趣,我刚刚偶然看到这篇文章,其中更详细地描述了Martijn在下面给出的答案:我想知道,为什么它们在Python日志代码中做得不同:-在调用
self\u log
@JustAMartin时,在args
之前缺少*
,因为期望值作为一个序列、一个参数插入到日志消息中。它不希望这些作为单独的参数。method(*args,**kwargs)
模式不适用于此,因为不打算对方法签名进行阴影处理,Logger.\u log()
是一个内部方法,publicLogger.info()
不需要假装它接受相同的参数。