相关疑难解决方法(0)

如何通过Python args和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()
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)

python

12
推荐指数
2
解决办法
4832
查看次数

Python 中位置函数参数的默认值?

我正在检查一些代码,发现了以下函数:

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

6
推荐指数
2
解决办法
4696
查看次数

标签 统计

python ×2