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


个人认为比较有用的就是 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 - inspect 模块的简单使用的更多相关文章

  1. python inspect 模块 和 types 模块 判断是否是方法,模块,函数等内置特殊属性

    python inspect 模块 和 types 模块 判断是否是方法,模块,函数等内置特殊属性 inspect import inspect def fun(): pass inspect.ism ...

  2. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  3. python——inspect模块

    inspect模块常用功能 import inspect # 导入inspect模块 inspect.isfunction(fn) # 检测fn是不是函数 inspect.isgenerator((x ...

  4. python inspect.stack() 的简单使用

    1. #python # -*- encoding: utf-8 -*- #获取函数的名字 import inspect def debug(): callnamer = inspect.stack( ...

  5. Python第三方模块--requests简单使用

    1.requests简介 requests是什么?python语言编写的,基于urllib的第三方模块 与urllib有什么关系?urllib是python的内置模块,比urllib更加简洁和方便使用 ...

  6. 用python socket模块实现简单的文件下载

    server端: # ftp server端 import socket, os, time server = socket.socket() server.bind(("localhost ...

  7. python optparse模块的简单用法

    # coding = utf-8 from optparse import OptionParser from optparse import OptionGroup usage = 'Usage: ...

  8. Python Turtle模块的简单应用

    时钟 import turtle as t import datetime as dt #画出背景 game = t.Screen() game.bgcolor("white") ...

  9. 浅谈Python时间模块

    浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...

  10. 简单认识python cmd模块

    0X00 前言 在早前用别人的工具时,发现有些大佬会用到交互式shell,那时候就挺好奇的,但是一直都没有看一下怎么做到的. 今天在翻p牛的博客的时候,看到他早之前写的一个工具就有用到交互式shell ...

随机推荐

  1. C语言中位运算取余

    位运算取余 求一个数被另一个数整除的余数,可以用求余运算符"%",但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是2的 ...

  2. 【OpenGL ES】绘制正方形

    1 前言 ​ [OpenGL ES]绘制三角形 中介绍了绘制三角形的方法,本文将介绍绘制正方形的方法. ​ OpenGL 以点.线段.三角形为图元,没有提供绘制正方形内部的接口.要绘制正方形内部,必须 ...

  3. pico命令

    pico命令 pico是一个简单易用.以显示导向为主的文字编辑程序,具有pine电子邮件编写器的风格.在现代Linux系统上,nano即pico的GNU版本是默认安装的,在使用上和pico一模一样. ...

  4. 如何避免FOUC

    如何避免FOUC FOUC即无样式内容闪烁也可以称为文档样式短暂失效,主要就是指HTML已加载而样式表并未加载,此后样式表再加载而产生的闪烁现象. 样式表前置 根据浏览器渲染的顺序,将CSS在< ...

  5. Java设计模式-备忘录模式Memento

    介绍 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 可以这里理解备忘录模式:现实生 ...

  6. Go语言并发编程(3):sync包介绍和使用(上)-Mutex,RWMutex,WaitGroup,sync.Map

    一.sync 包简介 在并发编程中,为了解决竞争条件问题,Go 语言提供了 sync 标准包,它提供了基本的同步原语,例如互斥锁.读写锁等. sync 包使用建议: 除了 Once 和 WaitGro ...

  7. golang中协程&管道&锁

    进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基 本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进 程都有一个自己的地 ...

  8. queryset高级用法:prefetch_related

    这个方法和select_related方法类型,就是访问多个表中的数据的时候,减少查询的次数.这个方法是为了解决一对多和多对多的关系的查询问题.比如要获取标题中带有hello字符串的文章以及它的所有标 ...

  9. 【LeetCode排序专题02】最小k个数,关于快速排序的讨论

    最小k个数 https://leetcode.cn/problems/smallest-k-lcci/ 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个 ...

  10. C程序分别实现下列字符阵列的输出

    C程序分别实现下列字符阵列的输出:(https://zhuanlan.zhihu.com/p/443989560    可以参考这个博主写的) 1,左下三角形(代码) 1 #include <s ...