繁体   English   中英

如何通过 Python args 和 kwargs?

[英]How to pass through Python args and 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 = (<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 的方法来做到这一点?

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

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

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

    它用于分别表示任意数量的位置或关键字参数。 要记住的一点是,函数内部args将是一个 tuple ,而kwargs将是一个 dict

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

     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')

另请参阅saltycrane 博客以获取示例说明。

您使用与参数语法相同的语法传递它们:

self.save_name_for(*args, **kwargs)

请注意,您不需要传入self save_name_for已经绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM