inspect反射模块
作用
提供获取对象信息的函数,如模块、类、方法、函数、回溯、帧对象和代码对象
类型检查
用于判断对象的类型(如函数,类,生成器等),常用函数
- inspcet.isfunction(obj),检查是否为函数
- inspect.isclass(obj),检查是否为类
- inspect.ismethod(obj),检查是否为实例方法
- inspect.isgenerator(obj),检查是否为生成器
示例:
import inspect
def my_func():
pass
print(inspect.isfunction(my_func)) #true
print(inspect.isclass(my_func)) # false
print(inspect.ismethod(my_func)) # false
gen = (x for x in range(10))
print(inspect.isgenerator(gen))#true
获取源代码
提取函数,类或模块的源代码字符串:
- inspect.getsource(obj),返回对象的源代码
- inspect.getdoc(obj),返回对象的文档字符串
示例:
def add(x: int,y: int) -> int:
"""_summary_
Args:
x (int): 参数1
y (int): 参数2
Returns:
int: 返回值
"""
return x + y
print(inspect.getsource(add))
print(inspect.getdoc(add))
函数签名分析
提取函数参数信息(参数名,默认值,注解等):
- inspect.sigunature(func),返回函数的参数签名对象
示例:
sig = inspect.signature(add) # 返回的是函数签名对象
print(sig.parameters) # OrderedDict([('x', <Parameter "x: int">), ('y', <Parameter "y: int">)])
for name,param in sig.parameters.items():
print(f'{name}: {param.annotation}')
堆栈与栈帧操作
动态获取调用栈和当前执行上下文
- inspect.stack(),返回当前调用栈的帧信息列表
- inspect.currentframe(),获取当前执行帧对象
示例:
def demo():
price = 12
category = "apple"
frame = inspect.currentframe() # 获取当前栈帧对象
print(frame.f_back) # 获取调用当前栈帧对象的上一级栈帧对象
print(frame.f_back.f_code.co_name) # 获取调用当前栈帧对象的上一级栈帧对象的函数名
print(frame.f_code.co_name) # 获取当前函数名
print(frame.f_locals) # 获取当前栈帧的局部变量字典
print(frame.f_locals.get("price")) # 获取当前栈帧局部变量中指定键的值
print(frame.f_globals) # 获取当前栈帧的全局变量字典
print(frame.f_globals.get("name")) # 获取当前栈帧全局变量中指定键的值
print(frame.f_lineno) # 获取当前行号
print("--------------------------------")
for frame_info in inspect.stack():
print(frame_info.function) # demo,main,<module>
def main():
demo()
main()
类与模块信息
获取类和模块的成员及属性
- inspect.getmembers(obj),返回对象的所有成员(属性,方法)等
- inspect.getmodule(obj),返回对象所属的模块
示例:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print(f'{self.name} is running')
def af(self):
print(f'after two years {self.name} is {self.age} years old')
def __repr__(self):
return f'{self.name}'
s = Student('jack', 27)
members = inspect.getmembers(s)
print(members)
print([name for name, _ in members if "run" in name])
print(inspect.getmodule(s).__name__)
-------------------------------------------
个性签名:代码过万,键盘敲烂!!!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
2022-03-03 按字符统计数量(包括中文)