Python 参数之 *args 和 **kwargs


先上一段代码:

#-*-coding:utf-8-*-

def fun(id, *args, **kwargs):
    print "id = ", id
    print "args = ", args
    print "kwargs = ", kwargs
    print "---------------------------------"

if __name__ == '__main__':
    fun(1,2,3,4)
    fun(1, a=1,b=2,c=3)
    fun('a','b','c', a=1,b=2,c=3)

    a = (1,2,3,4)
    b = {'a':1,'b':2,'c':3}
    
    fun(*a, **b)

输出结果

id =  1
args =  (2, 3, 4)
kwargs =  {}
---------------------------------
id =  1
args =  ()
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------
id =  a
args =  ('b', 'c')
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------
id =  1
args =  (2, 3, 4)
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------

可见*args是一个元组,而**kwargs是一个字典,同时,根据Python的要求,**kwargs必须放在*args后面。

这一特性非常适合编写含有大量参数的程序,比如使用字典,在程序中可以先判断该值是否存在,然后进行下一步的操作。判断字典值是否存在可以使用dict.has_key('key')进行判断。

**kwargs还有下面的更常用的用法,参考下Matplotlib里面的一个常用法。

x = kwargs.pop('x', 0.5)
y = kwargs.pop('y', 0.98)

if ('horizontalalignment' not in kwargs) and ('ha' not in kwargs):
    kwargs['horizontalalignment'] = 'center'

首先,可以使用pop函数,pop函数用于删除dict中的一个值,并返回这个值,在上面的例子中,如果kwargs中没有x,则返回0.5。

另外,也可以使用if 'fontsize' not in kwargs判断key是否存在。