Python 在源码函数中的*args和**kwargs

一、两个参数的含义

*args:任意个无名参数,类型为tuple或list(()元组和[]列表)

**kwargs:任意个关键字参数(key-word args,键值对),类型为dict({}字典)

*arg和**kwargs在函数定义优先级方面最低,其中*args参数优先于**kwargs参数。

发扬了参数传递的灵活性。

*参数和**参数在源码中的存在方式如下图matplotlib.pyplot.plot方法的源码:

Python 在源码函数中的*args和**kwargs

二、*和**两者出现在函数定义中的作用——打包

在python中,当*和**符号出现在参数中时,表示任意个数的参数。

*arg表示任意多个无名参数,类型为tuple;稍后解释;

**kwargs表示关键字参数,为dict;稍后解释;

 

定义时需将*arg放在**kwargs之前,否则会出现错误提示 ” *parameter after ** parameter ”

使用时需将*arg放在**kwargs之前,否则会有“SyntaxError: positional argument follows keyword argument”的语法错误

Python 在源码函数中的*args和**kwargs

Python 在源码函数中的*args和**kwargs

 

三、*和**两者出现在函数调用中的作用——解包

 

在函数调用时,*parameter 会以单个元素的形式分解tuple,使其成为独立的参数。

在函数调用时,**parameter会以键/值对的形式分解成dict,使其成为独立的关键字参数(有索引)。

 

通过一个元祖给普通函数传递参数,并且分解成单个的元素

Python 在源码函数中的*args和**kwargs

如果已经有一个dict,在参数前面加**,函数会把dict中所有键值对转换为关键字参数传进去,该例子中关键字参数是extract。

Python 在源码函数中的*args和**kwargs

 

四、总结

 

定义中参数存在*和**parameter,其功能是打包(传入普参后转化成为tuple和dict类型)

调用的时候参数存在*parameter和**parameter,其功能是解包(将传入的tuple和dic变量转化成普参)

 

 

 

 

本文借鉴了 徐玖Python  https://www.cnblogs.com/xujiu/p/8352635.html