淺談Python的函數簽名

(本文大部分內容來源於此鏈接的文章
,我對部分內容做了一些改動,方便自己日後複習,若有侵權,請聯繫我,我會將此文刪除,謝謝)

函數簽名對象,表示調用函數的方式。在Python中,可以使用模塊inspect中的方法或類,來操作或創建函數簽名。


1 獲取函數簽名及參數

使用inspect模塊的signature方法,來獲取函數簽名對象;通過函數簽名的parameters屬性,獲取函數參數。

>>> from inspect import signature
>>> def foo(value):
...     return value
...
>>> foo_sig = signature(foo) # 獲取foo函數的簽名
>>> foo_params = foo_sig.parameters # 通過函數簽名的parameters屬性,可獲取函數的參數
>>> foo_params
mappingproxy(OrderedDict([('value', <Parameter "value">)]))

2 創建函數簽名

使用類Parameter的實例創建函數參數列表;使用Signature類,接受函數參數列表,實例化輸出函數簽名實例。

>>> from inspect import Signature, Parameter # 注意首字母大寫
>>>
>>> # 創建一個函數參數列表,列表內的元素由Parameter類的實例組成
>>> # Parameter實例化時,依次接受參數名、參數類型、默認值和參數註解
>>> # 默認值和參數類型默認爲空,這裏的空值不是None,而是Parameter.empty,代表沒有值
>>> params = [Parameter('x', Parameter.POSITIONAL_OR_KEYWORD),
...           Parameter('y', Parameter.POSITIONAL_OR_KEYWORD),
...           Parameter('z', Parameter.KEYWORD_ONLY, default=9)]
>>>
>>> sig = Signature(params) # 使用Signature類,接受函數參數列表,實例化出函數簽名實例
>>> sig # 函數簽名實例
<Signature (x, y, *, z=9)>

3 檢查函數參數是否匹配簽名

使用函數簽名的bind的方法,檢查函數參數是否匹配簽名。

延續上面的例子,通過函數簽名的bind方法,接受函數參數,如果匹配,返回參數BoundArguments實例;如果不匹配,則拋出TypeError異常,並給出詳細的異常信息。

通過BoundArguments實例的屬性,可以獲取函數簽名、參數的值等內容。

>>> bound_args_01 = sig.bind(1, 2, z=3)
>>> bound_args_01
<BoundArguments (x=1, y=2, z=3)>
>>> 
>>> bound_args_02 = sig.bind(1, 2)
>>> bound_args_02
<BoundArguments (x=1, y=2)>
>>> 
>>> bound_args_03 = sig.bind(1) # 產生了TypeError異常: missing a required argument: 'y'

(本文大部分內容來源於此鏈接的文章
,我對部分內容做了一些改動,方便自己日後複習,若有侵權,請聯繫我,我會將此文刪除,謝謝)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章