- basic
>>> import inspect
>>> inspect.ismodule(inspect) # 检查 inspect 是否为模组
True
>>> inspect.ismethod(inspect) # 检查 inspect 是否为对象方法
False
>>> inspect.isfunction(len) # 检查 len 是否为函数
True
>>> inspect.isbuiltin(len) # 检查 len 是否为内置函数
True
>>> inspect.isgenerator(inspect) # 检查 inspect 是否为生成器
False
>>> inspect.isawaitable(inspect) # 检查 inspect 是否可用于 await 表达式
False
>>>
- Signature
- bind
from functools import wraps
def checked(func):
ann=func.__annotations__
sig=inspect.signature(func)
@wraps(func)
def wrapper(*args,**kwargs):
bound=sig.bind(*args,**kwargs)
for k,v in bound.arguments.items():
if k in ann:
assert isinstance(v,ann[k]),f'Type Error Expected {ann[k]}'
return func(*args,**kwargs)
return wrapper
>>> @checked
... def add(a: int, b: int) -> int:
... while b:
... a, b = b, a % b
... return a
>>> add(2.7, 3.6)
Traceback (most recent call last):
AssertionError: Type Error Expected <class 'int'>
>>> add(27, 36)
9