python中的*args 和 **kwargs

*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来取值。