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函數的定義

 

 

 

這里為什么不用print()函數而用format()呢

可以試試print()函數來解包

>>> print(**c) Traceback (most recent call last): File "<pyshell#40>", line 1, in <module> print(**c) TypeError: 'age' is an invalid keyword argument for this function 

因為print()函數只支持 *args,不支持 **kwargs,源碼附上

 

 

 

四. 在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()函數的源碼

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM