【发布时间】:2023-03-19 21:19:01
【问题描述】:
虽然我对 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 = (<Person: >, (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'} # <= I want this
我意识到我可以在 save_name 中解析它们,然后将它们显式传递给 save_name_for,但这似乎很不优雅。我还想我可能会这样做,因为 args 是一个元组......
kwargs = args[2]
...但它似乎不起作用。 args[2] 就是一切(我不明白这一点)。有没有 Pythonic 的方式来做到这一点?
【问题讨论】:
标签: python