Python里的*args and **kwargs
http://book.pythontips.com/en/latest/args_and_kwargs.html
https://stackoverflow.com/questions/3394835/use-of-args-and-kwargs
很多python新手会对于github和python标准库源码以及网上示例中各种*args and **kwargs感到困惑,这里解释一下。
首先说明下:
*args和**kwargs(key word args)只是一个约定俗成的写法,就相当于我们在列举一些事务时使用...结尾,你也可以使用.....或者。。。。。或者~~~~~等等符号,重要的是*和**这两个前缀,你用*inputs或者**inputs也可以。
*args和**kwargs在很多python相关的官网常被用于介绍函数用法,其作用是表示多个参数,这点接下来会慢慢解释清楚。
其实一般情况下在定义一个method或class时是不需要*args和**kwargs的,比如如下函数:
def get_fullname(first_name,last_name):
print(first_name+' '+last_name) get_fullname('Leo','Messi')
# Leo Messi
但是假如输入参数的数目是不确定的呢?由于输入参数不确定,因此我们不能确定该定义多少个输入参数,这时候*args就有用了:
def get_fullname(*args):
fullname=''
for name in args:
fullname+=' '+name
print(type(args))
print(fullname) get_fullname('Lionel','Andrés','Messi')
# <class 'tuple'>
# Lionel Andrés Messi
可以看到*args的作用就是代表多个输入参数,python默认将多个输入参数存入一个名为args的元组中,但是注意这个元组本身并不是输入参数,在加上*前缀后,*args表示将元祖中的每个元素都当做一个输入参数(位置传参)。
当然直接定义一个元组然后将其作为参数也是可行的,python会把这个元组解析为位置传参的输入参数例如:
tup=('Lionel','Andrés','Messi')
def get_fullname(*args):
fullname=''
for name in args:
fullname+=' '+name
print(type(args))
print(fullname) get_fullname(*tup) //注意这里tup前必须加*才能表示以元组的形式处理输入参数,否则函数会把tup元组本身当做一个输入参数处理
# <class 'tuple'>
# Lionel Andrés Messi
至于**kwargs其作用就很好解释了,和*args的作用差不多,区别是*args是把参数列表当做一个元组进行处理,而**kwargs则是把参数列表当做一个dict处理,你要么传入多个key=value格式的参数,要么像如下示例一样直接传入一个字典:
from pymysql import Connect
config = {
'host':'10.0.1.200',
'port':6033,
'user':'leo',
'password':'leo',
'db':'test',
'charset':'utf8'
}
try:
conn=Connect(**config)
......
这里config是一个dict,**config就表示将此dict的key-value们解析为多个key=value的输入参数。
完整示例:
import pymysql class BasicServer(object):
def __init__(self , **kwargs):
self.conn = pymysql.connect(**kwargs)
# 这里使用**kwargs表示多个输入参数,且只能是key=value的格式,或者直接传入一个dict
def _query(self , sql):
with self.conn.cursor() as cursor:
cursor.execute(sql)
result = cursor.fetchall()
return result
self.conn.commit() def _close(self):
self.conn.close() def get_version(self):
version = self._query("select VARIABLE_NAME,VARIABLE_VALUE from information_schema.SESSION_VARIABLES where "
"VARIABLE_NAME in ('VERSION_COMMENT','VERSION','VERSION_COMPILE_MACHINE',"
"'VERSION_COMPILE_OS');")
return version if __name__ == '__main__':
conn_dict = { 'host': '10.1.1.11' , 'port': 3306 , 'db': None , 'user': 'leo' ,
'password': 'leo' , 'charset': 'utf8' , 'cursorclass': pymysql.cursors.DictCursor }
testServer = BasicServer(**conn_dict)
# 以上两行代码也可以使用如下一行代码代替:
# testServer = BasicServer(host='10.1.1.11',port=3306,user= 'leo',password='leo')
version = testServer.get_version()
print(version)
最新文章
- [PHP源码阅读]strlen函数
- TypeScript中的枚举类型
- Hdu 2955 Robberies 0/1背包
- DataSet读取XML
- Android源码下载并绑定到Eclipse中
- linux 进程间消息队列通讯
- 管理员把我的admin权限去掉了,那么如何获得jdk zip安装呢?这篇可以帮你。
- java多线程基本概述(七)——join()方法
- SQL Server 2008 开启数据库的远程连接
- Spring boot 整合mybatis
- 安卓TV开发(九) Android模拟事件 遥控器变身成鼠标来操作TV
- 【土旦】 使用Vant 的Uploader 上传图片 重定义返回格式 使用FormData格式提交
- kali linux 使用笔记本快捷键调节音量
- 重新认识 Delphi
- Windows下nginx+tomcat实现简单的负载均衡
- 【JMeter】【微信好文收藏】Jmeter接口测试实战-有趣的cookie
- (转)Linux 系统服务的启动顺序解析 rc.*
- 【Linux】【Jmeter】配置Jmeter服务器和运行Jmeter
- 统计--VARCHAR与NVARCHAR在统计预估上的区别
- 关于 as 播放器的记录
热门文章
- [01]Go设计模式:单例模式(Singleton)
- 2018NOIP赛后总结+后阶段信奥学习个人规划
- word2vec用到的c语言知识
- mini_magick上传图片
- 【Html5】使用学习
- ASP.NET Core Web API 最佳实践指南
- django基础之day09,创建一个forms表单组件进行表单校验,知识点:error_messages,label,required,invalid,局部钩子函数,全局钩子函数, forms_obj.cleaned_data,forms_obj.errors,locals(), {{ forms.label }}:{{ forms }},{{ forms.errors.0 }}
- Python高级应用程序设计任务
- Python基础-day02-2
- 解决Android killer APK 编译失败,无法继续下一步签名