我们为什么要将args作为args传递而不是“* args”?

时间:2016-01-27 17:18:29

标签: python

在我阅读Django文档时,我在示例中看到了这一点:

from django.db import models

class HandField(models.Field):

    description = "A hand of cards (bridge style)"

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 104
        super(HandField, self).__init__(*args, **kwargs)

我不明白为什么对super的调用是:

super(HandField, self).__init__(*args, **kwargs)

然而(来自C编程)我认为它应该是:

super(HandField, self).__init__(args, kwargs)

怎么来的?

是。而且我不是说“*”和“**”(链接标记为重复)是什么意思,我问为什么它没有被重新发送没有明星=为什么它会重新发送给带有星星的父,这对我来说意味着:“字典词典”。我的问题与重复链接不同,重复链接无法解答我的问题。

1 个答案:

答案 0 :(得分:1)

您使用* / **的原因是解压缩您给出的打包值。初始化类时,可能会使用以下命令初始化:

HandField(1, 2, 3, abc=4, xyz=5)

因为它使用可变长度位置(*)和动态关键字(**)参数接收参数(以避免需要记住和处理其父类构造函数接收的细节),收到args (1, 2, 3)kwargs{'abc': 4, 'xyz': 5}。如果父类定义为__init__

def __init__(self, a1, a2, a3, spam=6, eggs=7, abc=None, xyz=None):

然后调用super(HandField, self).__init__(args, kwargs)会将args tuple传递为a1,将kwargs dict传递为a2,然后传递对a3或其他论点一无所知。通过unpacking args and kwargs,您可以转换回单个位置和关键字参数,因此a1将获得1a2 2a3 {{1 },3 abc4 xyz

基本上,他们是反向操作;如果你接受5,那么调用者将逐个传递位置参数,并且它们被#34;打包"进入单个*,接受tuple接受单个关键字参数"打包"作为单个**。如果你想以同样的方式传递它们,你可以解压缩"他们使他们成为个人论点,而不是争论的集合。