首页 > 编程语言 >Python - inspect 模块的简单使用

Python - inspect 模块的简单使用

时间:2024-03-27 16:48:53浏览次数:25  
标签:调用 Python frame inspect 获取 模块 def

Python中的inspect模块解析

Python的inspect模块是一个强大的内省工具,允许开发者检查(inspect)活动对象和源代码。它提供了一系列函数,用于获取信息关于正在运行的程序和调用堆栈,非常适合进行调试和动态分析。本文将通过介绍inspect模块的关键功能,并结合实际案例代码,来探索其在日常开发中的应用。

常用方法

1. 获取当前执行的函数或方法名、文件路径【并不是调用方】

在日志记录或调试时,知道当前执行的函数名是非常有用的

import inspect

def who_am_i():
    # 输出当前文件绝对路径
    print(inspect.currentframe().f_code.co_filename)
    return inspect.currentframe().f_code.co_name

print(who_am_i())  # 输出: who_am_i

image.png
个人认为比较有用的就是 co_filename、co_name

2. 获取调用者信息

获取当前函数或方法的调用者信息

import inspect

def caller_info():
    frame = inspect.currentframe().f_back
    print(f调用者 {frame.f_code.co_filename} 调用行号 d{frame.f_lineno}")

def test():
    caller_info()  # 调用以获取调用者信息

test()

这个例子显示了如何获取调用当前函数的代码位置,非常有助于调试复杂的调用链

3. 查看函数参数

inspect模块可以用来检查函数或方法的参数,这对于动态分析和生成文档非常有用

import inspect

def sample_function(name, age=25):
    pass

sig = inspect.signature(sample_function)
print(sig)  # 输出: (name, age=25)

4. 获取源代码

inspect还可以用来获取函数、类或模块的源代码

import inspect

def my_function():
    """A simple function."""
    pass

print(inspect.getsource(my_function))

5. 检查类和实例

inspect模块提供了多种方式来检查类和实例,比如获取类的所有方法、属性等

class MyClass:
    def method_one(self):
        pass
    
    def method_two(self):
        pass

# 获取类的所有成员方法
methods = inspect.getmembers(MyClass, predicate=inspect.isfunction)
print(methods)  # 输出 MyClass 中定义的方法

实际案例:自动化场景下的应用

一个常见的使用场景是动态地调用函数或方法,并基于它们的签名自动生成文档。


def test():
    # 获取调用方
    frame = inspect.currentframe().f_back
    # 获取调用方文件绝对路径
    caller_file = inspect.getfile(frame)
    # 这种方式也可以
    caller_file = frame.f_code.co_filename

    ...
    
    params = [
        caller_file,
        "--env-data",
        env_data.json(),
        f"--count={count}",
        "-m",
        mark,
    ]

一个基于 Pytest 自动化测试项目

  1. 每个 py 模块都会调用这个方法来执行 Pytest 命令来跑测试用例
  2. 那怎么才能准确知道要跑哪个文件呢?
  3. 通过第一、二行代码即可

更便捷的方式

标签:调用,Python,frame,inspect,获取,模块,def
From: https://www.cnblogs.com/poloyy/p/18099637

相关文章

  • Python基础
    基础1.1常量具有字面意义的,按照字面意义使用他们的值,不能改变值。例如1、3.8、3.4e-3这样的数,或者是’Thisisastring’、“It’sastring!”这样的字符串。1.2数三种类型:整数、浮点数和复数整数:2浮点数:3.8、3.4e-3复数:(-5+4j)、(2.3-4.6j)在Python中不用区分'lon......
  • 巨控GRMOPC模块的应用
    在如今这个高度数字化、信息化的时代,企业和个人对信息安全和设备稳定运行的需求空前高涨。特别是在某些关键行业中,如制造业、数据中心、医疗保健等领域,一旦系统出现故障,不仅可能导致经济损失,还可能对人身安全造成威胁。因此,及时的故障报警和信息通知成为了维护系统稳定不可......
  • NX二次开发:切换应用模块
    一、概述    最近将唐工的教学视频基本上看完了,收获很大;昨天NX二次开发学习群中,有小伙伴说在从建模模块切换到加工模块是说有问题,我尝试了一下录制的代码,确实有BUG,调试了一下,找到了一种方法,做以下笔记,防止忘记。最近感觉学的内容有点多,不知怎么回事总是记忆不清。二......
  • 速度与效率的双赢:探索ADOP 100G多模光模块的优势
    当今通信行业的快速发展,对数据传输速度和稳定性的要求日益增高。ADOP品牌的100G多模光模块正是在这样的背景下应运而生,它不仅提供了高速的数据传输能力,而且还具有多种优势,使其成为数据中心和高性能计算网络的理想选择。产品概述: ADOP的100GQSFP28SR4多模光模块是一款高性能......
  • Python_PyStray结合Tkinter显示系统托盘图标
    前言PyStray是一个用于Python的系统托盘图标库,它可以让您轻松地在Windows、macOS和Linux下创建和管理托盘图标应用程序。通过PyStray,您可以创建自定义托盘图标、菜单和气泡通知,并响应托盘图标的各种事件。PyStray的主要特点包括:跨平台支持:支持Windows、macOS和Li......
  • 使用compileall模块编译Python的源代码
    编译当前目录及子目录所有python源码为pyc文件python-mcompileall-b.参数说明-b:这个选项告诉compileall模块在编译时进行备份。它会为每个已编译的源文件创建一个备份文件,后缀为.pyc.bak.:这是命令行中的当前目录。这意味着compileall将会在当前目录及其所有子目录中......
  • yolov8添加EffectiveSE 注意力模块
    ######################BiFPN####################################BiFPN#两个特征图add操作classBiFPN_Add2(nn.Module):def__init__(self,c1,c2):super(BiFPN_Add2,self).__init__()self.w=nn.Parameter(torch.ones(2,dtype=torch.f......
  • Python教程:深入探索 Python 列表(List)
    在Python中,列表(List)是一种非常常用且强大的数据结构,它能够存储多个元素,并提供了丰富的操作方法。本文将带您深入探索Python列表,从基础知识到高级应用,让您全面掌握列表的各种技巧和用法。1.列表基础1.1什么是列表列表是一种有序、可变、允许重复元素的数据结构,用方......
  • Python读取NC文件指定经度、纬度与时相的数据
    Python读取NC文件指定经度、纬度与时相的数据本文介绍基于Python语言的netCDF4库,读取.nc格式的数据文件,并提取指定维(时间、经度与纬度)下的变量数据的方法。我们之前介绍过.nc格式的数据,其是NetCDF(NetworkCommonDataForm)文件的扩展名,是一种常用的科学数据存储格式,多用于存储科......
  • BOSHIDA DC电源模块与其他电源模块的区别与优势
    BOSHIDADC电源模块与其他电源模块的区别与优势在现代电子设备中,电源模块是不可或缺的组成部分。电源模块的作用是将外部电源的电能转换为设备所需的电能进行供应。在电源模块的选择中,DC电源模块与其他电源模块有着明显的区别与优势。 首先,DC电源模块与其他电源模块的区别在......