参数匹配顺序——Python学习之参数(三)
參數匹配順序——Python學習之參數(三)
文章目錄
- 參數匹配順序——Python學習之參數(三)
- 函數參數匹配表
- 參數匹配順序
- keyword-only 參數的位置
- 參考資料
這篇博文是對上一篇博文 參數匹配模型的總結與擴展。
函數參數匹配表
下面的表格總結了Python中參數匹配的語法。
考慮到翻譯過來可能不準確,我就不翻譯成中文了。
參數匹配順序
在函數調用中,參數必須以此順序出現:任何位置參數,后面跟著任何關鍵字參數(name=value)和*iterable形式的組合,最后是**dict形式。
在函數頭部,參數必須以此順序出現:任何一般參數(name),緊跟著任何默認參數(name=value),再然后是*name,再再然后是 keyword-only 參數(name或者name=value),最后是**name形式。
注意:在函數調用和函數頭部中,如果出現**arg形式的話,都必須出現在最后。
Python內部是按照以下的步驟在賦值前進行參數匹配的:
keyword-only 參數的位置
在一個函數頭部,keyword-only 參數必須編寫在**arg之前、*arg之后(如果二者都有的話)。無論何時,一個參數名稱出現在*arg之前,它應該是默認位置參數,而不是keyword-only 參數。
>>> def f(a, *b, **d, c=6): print(a, b, c, d) # Keyword-only before **! SyntaxError: invalid syntax >>> def f(a, *b, c=6, **d): print(a, b, c, d) >>> f(1, 2, 3, x=4, y=5) # Default used 1 (2, 3) 6 {'y': 5, 'x': 4} >>> f(1, 2, 3, x=4, y=5, c=7) # Override default 1 (2, 3) 7 {'y': 5, 'x': 4}>>> f(1, 2, 3, c=7, x=4, y=5) # Anywhere in keywords 1 (2, 3) 7 {'y': 5, 'x': 4}>>> def f(a, c=6, *b, **d): print(a, b, c, d) # c is not keyword-only here! >>> f(1, 2, 3, x=4) 1 (3,) 2 {'x': 4}第1行的寫法是錯誤的,如果c是一個keyword-only 參數,那么它必須在*b之后,**d之前,即第3行那樣。
第4行和第6行是函數調用,區別是第4行采用了參數c的默認值,第6行覆蓋了默認值。
第12行,c=6是一個帶有默認值的位置參數,第13行的“2”覆蓋了c的默認值。
在函數調用中,keyword-only 參數可以編寫在*arg之前或之后,也可能包含在**arg中。
第1行,c 是一個帶有默認值的keyword-only 參數。
>>> def f(a, *b, c=6, **d): print(a, b, c, d) # KW-only between * and ** >>> f(1, *(2, 3), **dict(x=4, y=5)) # Unpack args at call 1 (2, 3) 6 {'y': 5, 'x': 4}>>> f(1, *(2, 3), **dict(x=4, y=5), c=7) # Keywords before **args! SyntaxError: invalid syntax>>> f(1, *(2, 3), c=7, **dict(x=4, y=5)) # Override default 1 (2, 3) 7 {'y': 5, 'x': 4}>>> f(1, c=7, *(2, 3), **dict(x=4, y=5)) # After or before * 1 (2, 3) 7 {'y': 5, 'x': 4}>>> f(1, *(2, 3), **dict(x=4, y=5, c=7)) # Keyword-only in ** 1 (2, 3) 7 {'y': 5, 'x': 4}第5行,c=7 應該出現在 **dict(x=4, y=5) 之前;
第8和11行,c=7 可以出現在 *(2, 3)之后或之前;
第14行,c=7 可以出現在**dict(x=4, y=5, c=7)中。
【本系列完】
前兩篇文章分別是:
參數匹配模型——Python學習之參數(二)
Python學習之參數(一)
參考資料
《Python學習手冊(第4版)》,機械工業出版社
《Learning Python 5th Edition》, O’Reilly
總結
以上是生活随笔為你收集整理的参数匹配顺序——Python学习之参数(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 参数匹配模型——Python学习之参数(
- 下一篇: python3 json_Python3