虽然我对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()
Run Code Online (Sandbox Code Playgroud)
我将名称分成两个以上的函数.这样我就可以通过对save_name_for方法进行单元测试来对我通常将所有逻辑进行单元测试.
当我在解释器中运行它并在save_name方法中停止时,正如我所料,我看到:
(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}
Run Code Online (Sandbox Code Playgroud)
如果我然后进入save_name_for方法,我会看到:
(Pdb) args
self =
args = (<Person: >, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs =
Run Code Online (Sandbox Code Playgroud)
有没有办法将save_name方法接收到的kwargs直接传递给save_name_for方法,以便它们出现在后者的kwargs中?我想在save_name_for方法的名称空间中看到类似的内容:
(Pdb) args
self =
args = …Run Code Online (Sandbox Code Playgroud) 我正在检查一些代码,发现了以下函数:
def foo(self, arg1=1, *, arg2=2):
pass
Run Code Online (Sandbox Code Playgroud)
*我很惊讶地看到关键字参数位于位置参数的左侧。然后我注意到我可以foo通过以下两种方式进行调用:
>>> foo(1)
>>> foo(arg1=1)
Run Code Online (Sandbox Code Playgroud)
我想我会期望第二次调用失败,因为我foo通过提供关键字来使用命名参数进行调用arg1。
话虽如此,我在这两种情况下都使用位置参数,还是第二次调用foo命名参数?
python ×2