python的中文含义-python中的 * 和 ** 作用含义

python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的

一. 打包参数

* 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args

>>> def f(*args): # * 在函数定义中使用

print(args)

>>> f()

()

>>> f(1)

(1,)

>>> f(1, 2, 3, 4)

(1, 2, 3, 4)

** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwargs

>>> def f(**kwargs): # ** 在函数定义中使用

print(kwargs)

>>> f()

{}

>>> f(a=1, b=2)

{'a': 1, 'b': 2}

二. 解包参数

* 的作用:在函数调用中,* 能够将元组或列表解包成不同的参数

>>> def func(a, b, c, d):

print(a, b, c, d)

>>> args = (1, 2, 3, 4)

>>> func(*args) # * 在函数调用中使用

2 3 4

>>> args = [1, 2, 3, 4]

>>> func(*args)

2 3 4

** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数

>>> def func(a, b, c, d):

print(a, b, c, d)

>>> kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}

>>> func(**kwargs) # ** 在函数调用中使用

2 3 4

三. 注意

1. 在函数定义时, * 表示打包,在函数体内部, * 表示的却是解包,事实上,下面例子中print(*args)是print()函数的调用

>>> def foo(*args, **kwargs):

print(args) #未解包参数

print(*args) #解包参数

>>> v = (1, 2, 4)

>>> d = {'a':1, 'b':12}

>>> foo(v, d)

((1, 2, 4), {'a': 1, 'b': 12})

(1, 2, 4) {'a': 1, 'b': 12}

2. * 和 ** 的打包和解包并不能脱离函数而存在

如下的例子中,表面上看没有调用什么函数,实际上调用了format()函数

>>> c = {"name": 'zhang', "age": 2}

>>> **c

SyntaxError: invalid syntax

>>>

>>> "Name:{name}, Age:{age}".format(**c)

'Name:zhang, Age:2'

参考源码中对format函数的定义

fd751c06-1ad6-4cfc-a9ec-8afc7706f20f.png!large

这里为什么不用print()函数而用format()呢

可以试试print()函数来解包

>>> print(**c)

Traceback (most recent call last):

File "", line 1, in

print(**c)

TypeError: 'age' is an invalid keyword argument for this function

因为print()函数只支持 *args,不支持 **kwargs,源码附上

dd56f507-21e0-4643-b9b5-60c8c463c3a2.png!large

四. 在ddt中的应用

已知接口自动化中all_caseDatas是有N个字典组成的列表,@ddt.data(*all_caseDatas)中,data()是一个函数,调用函数时,参数*all_caseDatas自动将列表[{...}, {...}, {...}...]解包为{...}, {...}, {...}...,再传递给测试用例函数test_my_request(),这就是@ddt.data将每一条数据作为一条测试用例的原理

@ddt.data(*all_caseDatas)

def test_my_request(self, case_data):

global global_var

if len(global_var) != 0 and case_data["request_data"] is not None:

for key, value in global_var.items():

if case_data["request_data"].find(key) != -1:

case_data["request_data"] = case_data["request_data"].replace(key, value)

ddt中data()函数的源码

3f542b17-c36d-4dd7-927d-34f10c0b59d7.png!large

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值