*args
和 **kwargs
均为可变参数,方便记忆可以理解为 *args是列表形式的多个参数,不过它传值不是以list, 就是func(arg1, arg2, arg3...)
**kwargs可以理解为字典形式的多组key, value键值对,不过它传值也不是字典,而是func(a=1, b=2, c=3...)。
它们同时出现在func的定义中时,*args
在前, **kwargs
在后
**kwargs通常用在类的初始化多个配置项参数值传递。举一个pymongo的例子:
class MongoClient(common.BaseObject):
def __init__(
self,
host=None,
port=None,
document_class=dict,
tz_aware=None,
connect=None,
type_registry=None,
**kwargs):
对于MongoClient常用的初始配置就是host, port等,但它还有很多可选配置项,如username, password等,可以通过**kwargs来传值,如 MongoClient(host='127.0.0.1', username='root', password='123456')
*args用的地方比较随意,这两个同时出现多数情况都是用在装饰器上。
比如flask的一个扩展, flask_script的Manager类
def option(self, *args, **kwargs):
#该声明下还有一个示例
@option('-n', '--name', dest='name')
@option('-u', '--url', dest='url')
def hello(name, url):
print "hello", name, url
像这个option方法, -n或 --name 即对应的*args
, 后面的参数和值对应的**kwargs
再举一个简单例子,看看它们的传值和取值:
def get_fruits(owner, *args, **kwargs):
print(args)
print(args[0])
print(kwargs)
print(kwargs['size'])
get_fruits('John', 'red', 'yellow', size='small', location='CA')
输出内容为:
('red', 'yello')
red
{'size': 'small', 'location': 'CA'}
small
显然通过*args
值递的值为tuple类型,可以用索引取值,通过**kwargs
传递的值为dict, 可以通过key来取值。