Python支持可变长度的参数列表,可以通过在函数定义的时候使用*args和**kwargs这两个特殊语法来实现(args和kwargs可以替换成任意你喜欢的变量名)。先来看两个可变长参数使用的例子。

1.使用*args来实现可变参数列表:*args用于接受一个包装为元组形式的参数列表来传递非关键字参数,参数个数可以任意,如下例所示。


2.使用**kwargs接受字典形式的关键字参数列表,其中字典的键值对分别表示不可变参数的参数名和值。

如下例中apple表示参数名,而fruit为其对应的value.可以是一个或者多个键值对。


如果一个函数中同时定义了普通参数、默认参数,以及上述两种形式的可变参数,那么使用情况又是怎样的呢?来看一个简单的问题。


对于上面的函数下面几种调用方式哪些是不正确的呢?


答案是:上面的所有调用方式都是合法的!那么,为什么要慎用可变长度参数呢?

原因如下:

1.使用过于灵活。

上面的示例set_axis()随随便便就能写出好几种不同形式的调用方式。在混合普通参数或者默认参数的情况下,变长参数意味着这个函数的签名不够清晰,存在多种调用方式。如果调用者需要花费过多的时间来研究你的方法该如何调用,显然这并不是一种值得提倡的方式,变长参数可能会破坏程序的健壮性。

2.如果一个函数的参数列表很长,虽然可以通过使用*args和**kwargs来简化函数的定义,但通常这意味着这个函数可以有更好的实现方式,应该被重构。

前面的例子中 SumFun(*args)如果改为def Sum(seq),在函数调用之前将需要传递的参数保存在一个序列中,如seq = (123,4,5,6,7),再将序列seq作为参数传入Sum中也是一个不错的选择。同样 如果使用**kwargs的目的仅仅是为了传入一个字典,这将是一个非常糟糕的选择。

3.可变长参数适合在下列情况下使用(不仅限于以下场景):

(1)为函数添加一个装饰器。


(2)如果参数的数目不确定,可以考虑使用变长参数。如配置文件test.cfg内容如下:


(3)用来实现函数的多态或者在继承情况下子类需要调用父类的某些方法的时候。


总结:慎用不代表不用,什么项目都要依据自己项目的具体需求来定,要怎么用,每个团队,都会汇编自己的代码规范,所以这里给大家的就是一般情况下的建议!