首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们要把args当作args而不是"*args“呢?

为什么我们要把args当作args而不是"*args“呢?
EN

Stack Overflow用户
提问于 2016-01-27 17:18:28
回答 1查看 72关注 0票数 0

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

代码语言:javascript
复制
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)

我不明白为什么给超级主管的电话是:

代码语言:javascript
复制
super(HandField, self).__init__(*args, **kwargs)

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

代码语言:javascript
复制
super(HandField, self).__init__(args, kwargs)

怎么来的?

是。我不是在问"*“和"**”(链接标记为“复制”)是什么意思,我是在问为什么在没有的情况下不重新发送--=为什么它被重新发送给父母和星星,这对我来说意味着:“字典的字典”。我的问题和重复链接不同,重复链接不回答我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-27 18:45:22

使用*/**的原因是要解压给定的打包值。初始化类时,可以使用以下方法初始化:

代码语言:javascript
复制
HandField(1, 2, 3, abc=4, xyz=5)

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

代码语言:javascript
复制
def __init__(self, a1, a2, a3, spam=6, eggs=7, abc=None, xyz=None):

然后调用super(HandField, self).__init__(args, kwargs)将传递args tuplea1kwargs dicta2,而对a3或其他参数则不传递任何内容。通过kwargs,您可以转换回单个位置和关键字参数,这样a1就可以得到1a2 2a3 3abc 4xyz 5

基本上,它们是逆操作;如果您接受*,那么调用方将一个接一个地传递位置参数,并将它们“打包”到单个tuple中,接受**接受单个关键字参数“打包”为单个dict。如果您想以同样的方式传递它们,您可以“解压”它们,使它们成为单独的参数,而不是参数的集合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35043912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档