引數匹配順序——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++函式
- 機器學習之超引數機器學習
- python引數Python
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- Oracle RAC 環境 引數檔案的啟動順序Oracle
- 記學習滲透測試之報告測試引數三
- Java(三)引數Java
- Shell學習【引數傳遞】
- golang學習之路之函式可變引數Golang函式
- Pytest 順序執行,依賴執行,引數化執行
- Oracle RAC引數設定優先順序別問題分析Oracle
- python變數和引數Python變數
- python parameter引數Python
- Python多值引數Python
- (2)python引數Python
- Python3之函式的引數傳遞與引數定義Python函式
- python疑問5:位置引數,預設引數,可變引數,關鍵字引數,命名關鍵字引數區別Python
- jmeter學習指南之引數化CSV Data Set ConfigJMeter
- 深入學習js之——引數按值傳遞#9JS
- nofile引數的學習與整理
- Python函式/動態引數/關鍵字引數Python函式
- python基礎之 函式的引數Python函式
- 使用 Python 解析引數Python
- python初識引數Python
- bash 引數替換中的模式匹配模式
- python---函式引數、變數Python函式變數
- 深度學習(模型引數直方圖)深度學習模型直方圖
- 機器學習引數模型與非引數模型/生成模型與判別模型機器學習模型
- 什麼是請求引數、表單引數、url引數、header引數、Cookie引數?一文講懂HeaderCookie
- 系統學習機器學習之半引數方法(二)--基於密度機器學習
- python json格式轉url引數&分割, url引數轉json格式PythonJSON
- Python函式的位置引數、關鍵字引數精講Python函式
- 簽名生成 引數列表(Map、List)ASCII碼從小到大排序(字典順序)ASCII排序
- Python中的引數遮蔽Python
- python引數解析argparse用法Python
- Python基礎(11):引數Python