Python中 * 和 ** 的打包和解包,你真的理解了吗?
python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的。* 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args。
** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwargs。
* 的作用:在函数调用中,* 能够将元组或列表解包成不同的参数。
** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数。
在函数定义时, * 表示打包,在函数体内部, * 表示的却是解包,事实上,下面例子中print(*args)是print()函数的调用。
* 和 ** 的打包和解包并不能脱离函数而存在。如下的例子中,表面上看没有调用什么函数,实际上调用了format()函数。
参考源码中对format函数的定义。
这里为什么不用print()函数而用format()呢?可以试试print()函数来解包。
因为print()函数只支持 *args,不支持 **kwargs,源码附上。
已知接口自动化中all_caseDatas是有N个字典组成的列表,@ddt.data(*all_caseDatas)中,data()是一个函数。调用函数时,参数*all_caseDatas自动将列表[{...}, {...}, {...}...]解包为{...}, {...}, {...}...,再传递给测试用例函数test_my_request(),这就是@ddt.data将每一条数据作为一条测试用例的原理。
ddt中data()函数的源码。
今日互动:Python中* 和 ** 的打包和解包,看了这篇文章,你理解了吗?有任何问题可以在留言区给我们留言哦!