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__)
posted @   我在路上回头看  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
历史上的今天:
2022-03-03 按字符统计数量(包括中文)
点击右上角即可分享
微信分享提示