Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Python参数和kwargs?_Python - Fatal编程技术网

如何通过Python参数和kwargs?

如何通过Python参数和kwargs?,python,Python,虽然我对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

虽然我对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'}
(Pdb) args
self =
args = (<Person: >, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs = 
如果我随后进入save_name_for方法,我会看到:

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

。。。但它似乎不起作用。args[2]就是一切(我不明白这一点)。有没有类似python的方法可以做到这一点?

通过语法镜像参数语法传递它们:

self.save_name_for(*args, **kwargs)

请注意,您不需要传入
self
<代码>为保存名称已绑定。

在两种不同的情况下使用
*
**
运算符

  • 当用作函数定义的一部分时

    def save_name_for(self, *args, **kwargs):
    
    args = (1, 2)
    kwargs = {'last': 'Doe', 'first': 'John'}
    self.save_name_for(*args, **kwargs)
    
    它用于表示任意数量的位置或关键字 分别是论点。要记住的一点是,在 函数
    args
    将是一个元组,而
    kwargs
    将是一个 dict

  • 当用作函数调用的一部分时

    def save_name_for(self, *args, **kwargs):
    
    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')
    

  • 另请参阅,以获得示例解释。

    如果有人感兴趣,我刚刚偶然看到这篇文章,其中更详细地描述了Martijn在下面给出的答案:我想知道,为什么它们在Python日志代码中做得不同:-在调用
    self\u log
    @JustAMartin时,在
    args
    之前缺少
    *
    ,因为期望值作为一个序列、一个参数插入到日志消息中。它不希望这些作为单独的参数。
    method(*args,**kwargs)
    模式不适用于此,因为不打算对方法签名进行阴影处理,
    Logger.\u log()
    是一个内部方法,public
    Logger.info()
    不需要假装它接受相同的参数。