(本文大部分內容來源於此鏈接的文章
,我對部分內容做了一些改動,方便自己日後複習,若有侵權,請聯繫我,我會將此文刪除,謝謝)
函數簽名對象,表示調用函數的方式。在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'
(本文大部分內容來源於此鏈接的文章
,我對部分內容做了一些改動,方便自己日後複習,若有侵權,請聯繫我,我會將此文刪除,謝謝)