引數匹配順序——Python學習之引數(三)
引數匹配順序——Python學習之引數(三)
這篇博文是對上一篇博文引數匹配模型的總結與擴充套件。
函式引數匹配表
下面的表格總結了Python中引數匹配的語法。
考慮到翻譯過來可能不準確,我就不翻譯成中文了。
引數匹配順序
在函式呼叫中,引數必須以此順序出現:任何位置引數,後面跟著任何關鍵字引數(name=value
)和*iterable
形式的組合,最後是**dict
形式。
在函式頭部,引數必須以此順序出現:任何一般引數(name
),緊跟著任何預設引數(name=value
),再然後是*name
,再再然後是 keyword-only 引數(name
或者name=value
),最後是**name
形式。
注意:在函式呼叫和函式頭部中,如果出現**arg
形式的話,都必須出現在最後。
Python內部是按照以下的步驟在賦值前進行引數匹配的:
- 通過位置分配非關鍵字引數。
- 通過匹配變數名分配關鍵字引數。
- 其他額外的非關鍵字引數分配到
*name
元組中- 其他額外的關鍵字引數分配到
**name
字典中。- 用預設值分配給在頭部未得到分配的引數。
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
- Python學習之引數(一)Python
- C/C++多引數函式引數的計算順序與壓棧順序C++函式
- NLS引數優先順序解析
- HttpClient和HttpGet 引數的優先順序HTTPclient
- SpringMVC學習(三)對映請求引數&請求引數SpringMVC
- js中同名變數或者引數的優先順序JS變數
- 繼承中引數傳遞及呼叫順序繼承
- Swift學習筆記(三十三)——常量引數,變數引數和inout引數Swift筆記變數
- Data Guard 學習之引數設定
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- 同名函式的 帶 params 引數 與 不帶 params 引數的執行優先順序函式
- nls引數、環境變數以及函式等起作用的順序!變數函式
- Oracle RAC 環境 引數檔案的啟動順序Oracle
- 記學習滲透測試之報告測試引數三
- Java(三)引數Java
- Shell學習【引數傳遞】
- oracle goldengate引數學習OracleGo
- golang學習之路之函式可變引數Golang函式
- python引數Python
- C#引數傳遞之值引數C#
- Oracle RAC引數設定優先順序別問題分析Oracle
- oracle啟動例項時使用引數檔案的順序Oracle
- kettle 引數——變數引數和常量引數變數
- python疑問5:位置引數,預設引數,可變引數,關鍵字引數,命名關鍵字引數區別Python
- 【ASM學習】ASM引數說明ASM
- python變數和引數Python變數
- 深入學習js之——引數按值傳遞#9JS
- Python3之函式的引數傳遞與引數定義Python函式
- python parameter引數Python
- Python多值引數Python
- (2)python引數Python
- python函式之引數傳遞Python函式
- bash 引數替換中的模式匹配模式
- scala 呼叫 java 方法引數匹配問題Java
- udev控制磁碟引導順序dev
- 機器學習之超引數機器學習
- Python函式/動態引數/關鍵字引數Python函式