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)

最新文章

  1. [PHP源码阅读]strlen函数
  2. TypeScript中的枚举类型
  3. Hdu 2955 Robberies 0/1背包
  4. DataSet读取XML
  5. Android源码下载并绑定到Eclipse中
  6. linux 进程间消息队列通讯
  7. 管理员把我的admin权限去掉了,那么如何获得jdk zip安装呢?这篇可以帮你。
  8. java多线程基本概述(七)——join()方法
  9. SQL Server 2008 开启数据库的远程连接
  10. Spring boot 整合mybatis
  11. 安卓TV开发(九) Android模拟事件 遥控器变身成鼠标来操作TV
  12. 【土旦】 使用Vant 的Uploader 上传图片 重定义返回格式 使用FormData格式提交
  13. kali linux 使用笔记本快捷键调节音量
  14. 重新认识 Delphi
  15. Windows下nginx+tomcat实现简单的负载均衡
  16. 【JMeter】【微信好文收藏】Jmeter接口测试实战-有趣的cookie
  17. (转)Linux 系统服务的启动顺序解析 rc.*
  18. 【Linux】【Jmeter】配置Jmeter服务器和运行Jmeter
  19. 统计--VARCHAR与NVARCHAR在统计预估上的区别
  20. 关于 as 播放器的记录

热门文章

  1. [01]Go设计模式:单例模式(Singleton)
  2. 2018NOIP赛后总结+后阶段信奥学习个人规划
  3. word2vec用到的c语言知识
  4. mini_magick上传图片
  5. 【Html5】使用学习
  6. ASP.NET Core Web API 最佳实践指南
  7. django基础之day09,创建一个forms表单组件进行表单校验,知识点:error_messages,label,required,invalid,局部钩子函数,全局钩子函数, forms_obj.cleaned_data,forms_obj.errors,locals(), {{ forms.label }}:{{ forms }},{{ forms.errors.0 }}
  8. Python高级应用程序设计任务
  9. Python基础-day02-2
  10. 解决Android killer APK 编译失败,无法继续下一步签名