函數簽名對象,表示調用函數的方式,即定義了函數的輸入和輸出。
在Python中,可以使用标準庫inspect的一些方法或類,來操作或建立函數簽名。
擷取函數簽名及參數
使用标準庫的signature方法,擷取函數簽名對象;通過函數簽名的parameters屬性,擷取函數參數。
# 注意是小寫的signature
from inspect import signature
def foo(value):
return value
# 擷取函數簽名
foo_sig = signature(foo)
# 通過函數簽名的parameters屬性,可以擷取函數參數
foo_params = foo_sig.parameters
建立函數簽名
使用類Parameter的執行個體建立函數參數清單;使用Signature類,接受函數參數清單,執行個體化出函數簽名執行個體。
''
'''
# 注意是首字母大寫的Signature
from inspect import Signature, Parameter
# 建立一個函數參數清單,清單内的元素由類Parameter的執行個體組成
# Parameter執行個體化時,依次接受參數名、參數類型、預設值和參數注解
# 預設值和參數類型預設為空,這裡的空值不是None,而是Parameter.empty,代表沒有值
parms = [Parameter('x', Parameter.POSITIONAL_OR_KEYWORD),
Parameter('y', Parameter.POSITIONAL_OR_KEYWORD),
Parameter('z', Parameter.KEYWORD_ONLY, default=9)]
# 使用Signature類,接受函數參數清單,執行個體化出函數簽名執行個體
sig = Signature(parms)
檢查函數參數是否比對簽名
使用函數簽名的bind的方法,檢查函數參數是否比對簽名。
bound_args_01 = sig.bind(1, 2, z=3)
# <BoundArguments (x=1, y=2, z=3)>
bound_args_02 = sig.bind(1, 2)
# <BoundArguments (x=1, y=2)>
bound_args_03 = sig.bind(1)
# TypeError
# missing a required argument: 'y'