Python *arg与**kwarg区别

article/2025/10/1 6:10:48

*arg 与 **kwargs介绍

args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字参数。这其实就是 Python 中可变参数的两种形式,并且*args 必须放在 **kwargs的前面,因为位置参数在关键字参数的前面

*args的用法

*args就是就是传递一个可变参数列表给函数实参,这个参数列表的数目未知,甚至长度可以为0。

def test_args(first, *args):print('first params: ', first)print(type(args))print(args)for v in args:print ('args argument: ', v)
test_args(1, 2, 3, 4)
"""
first params:  1
<class 'tuple'>
(2, 3, 4)
args argument:  2
args argument:  3
args argument:  4
"""
test_args(1, {'dict_key1': 1, 'dict_key2': 2})
"""
first params:  1
<class 'tuple'>
({'dict_key1': 1, 'dict_key2': 2},)
args argument:  {'dict_key1': 1, 'dict_key2': 2}
"""

第一个参数是必须要传入的参数,所以使用了第一个形参,而后面三个参数则作为可变参数元组传入了实参,并且是作为元组tuple来使用的。当第二个参数为字典时,会把字典整体当做一个元组传入实参。作为元组tuple来使用

**kwargs

**kwargs则是将一个可变的关键字参数的字典传给函数实参,同样参数列表长度可以为0或为其他值

def test_kwargs(first, *args, **kwargs):print('Required argument: ', first)print(type(kwargs))print(args)print(kwargs)for v in args:print ('ars argument (args): ', v)for k, v in kwargs.items():print ('kwargs argument %s (kwargs): %s' % (k, v))test_kwargs(1, 2, 3, 4, k1=5, k2=6)
"""
first argument:  1
<class 'dict'>
(2, 3, 4)
{'k1': 5, 'k2': 6}
ars argument (args):  2
ars argument (args):  3
ars argument (args):  4
kwargs argument k1 (kwargs): 5
kwargs argument k2 (kwargs): 6
"""
test_kwargs(1, 2, 3, 4, **{"k1": 5, "k2":6})
"""
first argument:  1
<class 'dict'>
(2, 3, 4)
{'k1': 5, 'k2': 6}
ars argument (args):  2
ars argument (args):  3
ars argument (args):  4
kwargs argument k1 (kwargs): 5
kwargs argument k2 (kwargs): 6
"""

args类型是一个tuple,而kwargs则是一个字典dict,并且args只能位于kwargs的前面。上面那种方式和下面那种方式一致。**{"k1": 5, "k2":6} 拆分出k1=5, k2=6

调用函数

args和kwargs不仅可以在函数定义中使用,还可以在函数调用中使用。在调用时使用就相当于pack(打包)和unpack(解包),类似于元组的打包和解包。

def test_args_kwargs(arg1, arg2, arg3):print("arg1:", arg1)print("arg2:", arg2)print("arg3:", arg3)args = ("two", 3, 5)
test_args_kwargs(*args)#result:
arg1: two
arg2: 3
arg3: 5kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)#result
arg1: 5
arg2: two
arg3: 3

args和kwargs组合起来可以传入任意的参数,这在参数未知的情况下是很有效的,同时加强了函数的可拓展性。

Scrapy Item源码分析

在这里插入图片描述
在这里插入图片描述
scrapy/item.py

scrapy中Item做了一些兼容。可接受第一个值为字典那么args就可以接收到元组的一个值,里面为一个元素为字典,如果传入的是**kwargs时,那么kwargs就有一个为字典类型的值。
dict(*args, **kwargs)将位置参数或关键字参数转换为字典进行赋值。

def get_detail(*args, **kwargs):print(*args)print(args)print(kwargs)print(dict(*args, **kwargs))if args or kwargs:  # avoid creating dict for most common casefor k, v in dict(*args, **kwargs).items():print(k, v)a = {'a':1, 'b':2}get_detail(**a)
"""()
{'a': 1, 'b': 2}
{'a': 1, 'b': 2}
a 1
b 2
"""
get_detail(a)
"""
{'a': 1, 'b': 2}
({'a': 1, 'b': 2},)
{}
{'a': 1, 'b': 2}
a 1
b 2
"""

http://chatgpt.dhexx.cn/article/EXXUHqDx.shtml

相关文章

argc,argv是什么

来源&#xff1a;微信公众号「编程学习基地」 文章目录 argc&#xff0c;argv是什么如何解析程序参数“选项”是什么&#xff1f;"选项字符串"是什么解析参数 argc&#xff0c;argv是什么 如果你是一个 Linux 开发者&#xff0c;那么你一定需要给应用程序传递参数。…

数学符号arg的含义

argument of the maximum/minimum arg max f(x): 当f(x)取最大值时&#xff0c;x的取值 arg min f(x)&#xff1a;当f(x)取最小值时&#xff0c;x的取值 表示使目标函数取最小值时的变量值 From Wikipedia In mathematics, arg max (or argmax) stands for the argument of…

arg和*argv[]是什么?

我们知道main函数的标准原型应该是int main(int argc, char *argv[]);。argc是命令行参数的个数&#xff0c;argv是一个指向指针的指针。那为什么要写成char *argv[]而不写成char argv呢&#xff1f;这样写给表示argv不是指向单个指针&#xff0c;而是指向一个指针数组的首元素…

数学符号arg含义

argument of the maximum/minimum arg max f(x): 当f(x)取最大值时&#xff0c;x的取值 arg min f(x)&#xff1a;当f(x)取最小值时&#xff0c;x的取值 表示使目标函数取最小值时的变量值 From Wikipedia In mathematics, arg max (or argmax) stands for the argument of…

MLT解读

简介 在很多方法都在检测上做文章的时候&#xff0c;能看到MLT这样一篇在Public赛道做研究并取得相当好的效果的文章是很难得的&#xff0c;就像论文的标题一样&#xff0c;它直面了MOT目前针对二维图像的一个痛点&#xff0c;那就是遮挡问题尤其是密集人群场景下的遮挡问题。…

什么是TLB ?

TLB:Translation Lookaside Buffer. 根据功能可以译为快表&#xff0c;直译可以翻译为旁路转换缓冲&#xff0c;也可以把它理解成页表缓冲。里面存放的是一些页表文件&#xff08;虚拟地址到物理地址的转换表&#xff09;。当处理 器要在主内存寻址时&#xff0c;不是直接在内存…

G i t

Git 1、Git 概述1.1、版本控制工具 2、Git 常用命令★★★★2.1、设置用户签名★★★★2.2、初始化本地库★★★★2.3、查看本地库状态$ git status2.4、添加暂存区$ git add 文件名2.5、提交本地库2.6、修改文件$ vim 文件名2.7、历史版本 3、Git 分支操作3.1、分支的操作&am…

Megatron-LM GPT2

内容 使用原始 Megatron-LM 训练 GPT-2 训练数据设置运行未修改的 Megatron-LM GPT2 模型启用 DeepSpeed 参数解析初始化和训练 初始化使用训练 API 前向传播反向传播更新模型参数损失缩放检查点保存和加载DeepSpeed 激活检查点&#xff08;可选&#xff09;训练脚本使用 GPT-…

代码评审与LGTM

为什么80%的码农都做不了架构师&#xff1f;>>> 关于codereview&#xff0c;https://www.douban.com/note/593670479/ 在Google&#xff0c;系统保证了只有经过Critique评审通过的代码才能被提交进代码仓库Piper。 每个目录都有几个“owners”&#xff0c;通常是相…

lnmt

lnmt 简介 lnmt&#xff1a; 表示的是 linux nginx mysql tomcat 的简称 Apache 为HTML页面服务&#xff0c;而Tomcat实际上运行JSP页面和Servlet&#xff0c;Tomcat实际上运行JSP页面和Servlet&#xff0c;Tomcat处理静态HTML的能力不如Apache服务器 了解更多Tomcat 内容请…

社区出品|LGTM :数据圈内的周度「热点精选」

&#x1f4e2;「LGTM」的意思是指&#xff1a;在我看来不错 (Looks Good to Me)&#xff0c;这是代码审阅者在批准 CL 时说的常用语。ShardingSphere 社区开辟一个全新的内容专栏——「LGTM 专栏」致力为您带来业界最佳新闻&#xff0c;让您在 5 分钟内了解科技&#xff01;另外…

怎么开启远程重启服务器,怎么正确重启服务器

对于从事互联网行业的工作人员来说&#xff0c;远程桌面连接不上是一种很常见的情况&#xff0c;这个时候重启服务器是一种最直接最有效的解决办法&#xff0c;但是重启服务器也是分好几种方法的&#xff0c;下面就随着小编来了解一吧。 服务器连接不上的原因有以下几种&#x…

虚拟机重启服务器命令,虚拟机中重启命令

虚拟机中重启命令 内容精选 换一换 本章节介绍通过执行virsh edit vmx命令编辑虚拟机配置文件的操作方法,其中vmx是虚拟机名称。虚拟机的CPU绑定,是指将VM的vcpu绑定到同一个NUMA节点的物理CPU上。以将虚拟机的4个vcpu分别绑定到0/1/2/3物理核为例,介绍虚拟机CPU绑定的配置方…

xshell开启文件服务器的命令,xshell重启服务器命令

xshell重启服务器命令 内容精选 换一换 以NTP服务器、DNS服务器的操作系统均为SUSE为例:登录Linux弹性云服务器。执行以下命令,切换至root用户。sudo su -sudo su -执行以下命令,编辑ntp.conf文件。vim /etc/ntp.confvim /etc/ntp.conf添加以下语句,配置NTP服务器。server …

服务器系统重启命令,服务器重启命令

服务器重启命令 内容精选 换一换 openEuler,EulerOS,CentOS 8.0及以上操作系统默认开启SElinux强制模式,会导致工具安装失败。若想关闭SElinux强制模式,执行以下操作。临时关闭执行以下命令查询SELinux状态。sestatusCurrent mode显示enforcing表示SELinux已开启强制模式。…

MyBatis 拦截器执行顺序

1.原始 jdbc 工作流程 原始 jdbc 工作流程 以查询为例 1.1 加载驱动 Class.forName(Driver.class.getName()) 1.2 建立数据库连接 Connection root DriverManager.getConnection(“xx”, “xx”, “xx”) 1.3 预编译sql语句 PreparedStatement preparedStatement root.prep…

Mybatis拦截器打印sql

在项目中,通常会配置log4j2等来输出mybatis的sql,为了防止sql注入问题,我们通常会使用#{}的方式来注入sql的参数,这会导致我们拿到的sql日志是没替换参数的,参数都是通过问号?占位符的方式。当我们需要拿下sql去数据库客户端执行的时候,就会有一个困扰:需要把一个个问号…

mybatis拦截器实现权限管理

框架设计 基于Spring SecurityJWT技术实现登录认证和访问授权&#xff0c;基于Mybatis 拦截器实现数据权限的控制。由于已有前文介绍Spring Security如有兴趣可以查看&#xff0c;在此将重点于数据权限的实现及菜单等表结构的设计。 Mybatis 拦截器 介绍Mybatis拦截器之前先来了…

Mybatis拦截器失效

现象&#xff1a; 自定义插件注册成功&#xff0c;但是始终不进入拦截器方法&#xff1b; 我的拦截器&#xff1a; 排查 Mybatis拦截器是采用的责任链模式&#xff0c;一般拦截器中intercept方法中最后执行 invocation.proceed() 方法&#xff0c;将拦截器责任链向后传递&…

MyBatis拦截器实现原理

Mybatis拦截器并不是每个对象里面的方法都可以被拦截的。Mybatis拦截器只能拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler四个类里面的方法&#xff0c;这四个对象在创建的时候才会创建代理。 用途&#xff1a;实际工作中&#xff0c;可以使用Mybatis拦…