如何传递Python中的args和kwargs参数?

6 浏览
0 Comments

如何传递Python中的args和kwargs参数?

虽然我对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 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'}

如果我接着进入save_name_for方法,我会看到这个:

(Pdb) args
self =
args = (, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs = 

有没有办法直接将save_name方法接收到的kwargs传递给save_name_for方法,以便它们出现在后者的kwargs中?我希望在save_name_for方法的命名空间中看到像这样的东西:

(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}   # <= 我想要这个

我意识到我可以在save_name中解析它们,然后明确地将它们传递给save_name_for,但这似乎相当不优雅。我还想过这样做,因为args是一个元组…

kwargs = args[2]

…但它似乎不起作用。args[2]只是所有的东西(我不明白这一点)。有没有一种Pythonic的方法来做到这一点?

0