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)

Python里的*args and **kwargs的更多相关文章

  1. Python函数参数*args和**kwargs

    1. Python中使用*args和**kwargs #!/usr/bin/env python3 # coding: utf-8 # File: args_kwargs_demo.py # Auth ...

  2. python中应用*args 与**kwargs

    这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...

  3. 理解 Python 中的 *args 和 **kwargs

    Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...

  4. Python中的*args和**kwargs

    原文地址:http://www.linuxidc.com/Linux/2011-10/45083.htm 先来看个例子: ,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a ...

  5. Python中的 *args 和 **kwargs

    基本概念 Python支持可变参数,最简单的方法莫过于使用默认参数. def test_defargs(one, two=2): # 参数one没有默认值,two的默认值为2 print('Requi ...

  6. 转:Python: 什么是*args和**kwargs

    今天看源码的时候发现一个是*args和**kwargs,一看就能知道args是神马,就是所有参数的数组,kwargs就不知道了,google一下,一个人的blog写的比较简单明了,秒懂了~~kwarg ...

  7. Python : 什么是*args和**kwargs[转载]

    例子 def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsprint '------------------- ...

  8. Python中的*args和**kwargs的理解与用法

    一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...

  9. Python中的args和kwargs

    有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...

随机推荐

  1. aplipay支付-app支付之前后端实现

    目录 前言 一 前台aplipay实现 1.1 安装0x5e/react-native-alipay 1.2. 配置 1.3. Alipay.pay(orderStr) 二 后端 2.1 服务端sdk ...

  2. jQuery中操作页面的文本和值

    主要是区分俩种方法: 1.html():可以识别HTML文件,将里面内容全部打印(操作双标签) 2.text():只是将里面的内容打印出来,不能识别HTML格式(操作双标签) <!DOCTYPE ...

  3. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  4. git避免每次输入密码

    生成公匙 在仓库所在目录输入 ssh-keygen -t rsa -C "yourname@sina.com" 其中yourname@sina.com是注册邮箱.可以在%HOME% ...

  5. 【CuteJavaScript】Angular6入门项目(2.构建项目页面和组件)

    本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...

  6. docker初体验:Docker部署SpringCloud项目eureka-server

    Docker部署SpringCloud项目eureka-server 1 创建eureka-server工程 创建父工程cloud-demo,其pom.xml如下: <?xml version= ...

  7. nginx之 nginx限流配置

    limit_req zone=req_zone;严格依照在limti_req_zone中配置的rate来处理请求超过rate处理能力范围的,直接drop表现为对收到的请求无延时limit_req zo ...

  8. ElasticSearch 时间格式

    "datetime": { "type": "date", "format": "yyyy-MM-dd HH: ...

  9. 可以设置实体在Dynamics 365高级查找中不显示吗?

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  10. Windows下安装和破解redis desktopmanager 2019.4

    redis可视化客户端工具:redis desktop manager 破解版链接:https://www.52pojie.cn/thread-1042770-1-1.html redis deskt ...