gpt4 book ai didi

python - 如何传递 Python args 和 kwargs?

转载 作者:太空狗 更新时间:2023-10-29 17:41:51 31 4
gpt4 key购买 nike

虽然我对 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 方法的 namespace 中看到类似这样的内容:

(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 的方法来做到这一点?

最佳答案

*** 运算符用于两种不同的情况。

  1. 当用作函数定义的一部分时,

    def save_name_for(self, *args, **kwargs):

    它用于表示任意数量的位置或关键字论据,分别。要记住的一点是,在函数 args 将是一个元组,而 kwargs 将是一个字典

  2. 当用作函数调用的一部分时,

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

    *** 充当解包运算符args 必须是一个可迭代,并且 kwargs 必须是类似字典的args 中的项目将被解压并作为位置参数发送给函数,并且 kwargs 中的键/值对将被发送到函数关键字参数。因此,

    self.save_name_for(*args, **kwargs)

    相当于

    self.save_name_for(1, 2, last='Doe', first='John')

另见 saltycrane blog以获取示例说明。

关于python - 如何传递 Python args 和 kwargs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23744017/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com