作用
用于獲取函數簽名對象
基本用法
import inspect
# 待獲取簽名的函數
def func(x:int, y:str, z:list) -> None:
? ? pass
# 獲取簽名對象,包括函數名,參數等
sig = inspect.signature(func)?
print(sig)
?# 獲取簽名中的參數,返回有序字典
params = sig.parameters?
print(params)
# 通過循環并解構
for k, v in enumerate(params.items()):
? ? name, param = v
? ? print(param.annotation, param.kind, param.name)
# 獲取簽名中的返回值類型
ret = sig.return_annotation
print(ret)
例: 判斷輸入的實參是否為標注的類型
import datetime, time
import inspect
def check_str(func):
? ?def wrapper(*args, **kwargs):
? ? ? ?obj = inspect.signature(func)
? ? ? ?params = obj.parameters
? ? ? ?for k, v in enumerate(params.items()):
? ? ? ? ? ?name, param = v
? ? ? ? ? ?for i in args:
? ? ? ? ? ? ? ?if not isinstance(i, param.annotation):
? ? ? ? ? ? ? ? ? ?print("{}: {} is not string".format(name, i))
? ? ? ? ? ? ? ? ? ?raise TypeError
? ? ? ?ret = func(*args, **kwargs)
? ? ? ?return ret
? ?return wrapper
@check_str
def str_add(str1:str, str2:str):
? ?t1 = datetime.datetime.now()
? ?new_str = str1 + str2
? ?time.sleep(3)
? ?delta_time = (datetime.datetime.now() - t1).total_seconds()
? ?print(new_str, round(delta_time), sep="\n")
str_add(3, "4")