Python进阶之-inspect模块详解

✨前言:

Python中的inspect模块是用于获取对象的信息的模块,比如查看源代码、列出成员、检查类和函数的参数等,非常适用于调试和反射(introspection)。接下来,我会详细解释inspect模块,并结合例子说明一些常用的方法。
inspect 模块的主要功能包括:

获取对象信息:可以获取对象的类型、名称、模块、源代码等信息。
获取函数和方法的参数信息:可以获取函数或方法的参数列表、默认参数值、注解等信息。
获取类的继承关系和属性信息:可以获取类的基类、方法、属性等信息。 检查对象的属性和成员:可以检查对象是否具有某个属性或成员,并获取属性的值。
检查代码对象的源代码:可以获取函数、类、方法等对象的源代码。 inspect
模块在许多情况下非常有用,特别是在编写装饰器、元类和调试工具时。它提供了一种方便的方式来检查和操作代码对象,使开发者能够更好地理解和处理运行时的对象。

✨1. 查看源代码:

inspect.getsource(object): 返回对象的源代码。对于函数、类、方法或模块等,此方法返回其源代码字符串。

import inspect# 获取函数的源码
def demo_func():print("Hello, world!")print(inspect.getsource(demo_func))

✨2. 获取类或函数的参数信息:

inspect.signature(callable): 返回一个Signature对象,代表可调用对象的签名信息(参数信息)。

import inspectdef foo(a, *, b: int, **kwargs):passsig = inspect.signature(foo)
print(sig)  # 输出: (a, *, b:int, **kwargs)
print(sig.parameters['b'])  # 输出:b:int

✨3. 判断对象类型:

inspect.isfunction(object): 检查对象是否是函数。
inspect.isclass(object): 检查对象是否是类。
inspect.ismethod(object): 检查对象是否是绑定到类的方法。

import inspectclass DemoClass:def demo_method(self):passprint(inspect.isfunction(DemoClass))  # False
print(inspect.isclass(DemoClass))  # True
print(inspect.ismethod(DemoClass().demo_method))  # True

✨4. 获取模块或类的成员:

inspect.getmembers(object, [predicate]): 返回对象的成员列表。predicate是一个可选的函数,用来过滤返回的成员。

import inspect
import math# 获取math模块中所有成员
members = inspect.getmembers(math)
for name, value in members:print(name, value)# 获取类成员
class MyClass:def __init__(self):self.a = 1def my_method(self):passmembers = inspect.getmembers(MyClass, predicate=inspect.isfunction)
print(members)  # 输出类中所有函数成员

✨5. 获取类的继承关系:

inspect.getmro(cls): 返回一个元组,包含cls类的基类,按照方法解析顺序。

import inspectclass BaseClass:passclass DerivedClass(BaseClass):passprint(inspect.getmro(DerivedClass))
# 输出: (<class '__main__.DerivedClass'>, <class '__main__.BaseClass'>, <class 'object'>)

✨其他:

inspect的强大远不止于此,另外inspect还有很多使用方法,有兴趣的同学可以看inspect的源码,下面提供一些常用的。

🌟方法和属性的检查

inspect.ismodule(object): 检查对象是否是一个模块。
inspect.ismethoddescriptor(object): 检查对象是否是方法描述符。
inspect.isdatadescriptor(object): 检查对象是否是数据描述符。
inspect.isgeneratorfunction(object): 检查对象是否是生成器函数。
inspect.isgenerator(object): 检查对象是否是生成器。
inspect.iscoroutinefunction(object): 检查对象是否是协程函数。
inspect.iscoroutine(object): 检查对象是否是协程。
inspect.isasyncgenfunction(object): 检查对象是否是异步生成器函数。
inspect.isasyncgen(object): 检查对象是否是异步生成器。
inspect.isroutine(object): 检查对象是否是用户定义或内建的函数或方法。

🌟检查调用堆栈

inspect.stack(): 返回调用堆栈的帧记录列表,每个帧记录包含帧对象、文件名、行号、函数名、源代码行列表以及索引指向源代码行的列表。
inspect.currentframe(): 返回当前线程的当前帧对象。
inspect.getouterframes(frame, context=1): 获取帧对象的外部帧记录列表,context指定周围源代码行数。
inspect.getinnerframes(traceback, context=1): 获取traceback对象的内部帧记录列表。

🌟其他实用工具

inspect.getdoc(object): 获取对象的文档字符串。
inspect.getcomments(object): 获取对象的注释字符串。
inspect.getfile(object): 获取定义对象的文件名。
inspect.getmodule(object): 获取定义对象的模块。
inspect.getsourcefile(object): 获取定义对象的源码文件名。
inspect.getsourcelines(object): 获取对象的源码行。
inspect.getlineno(object): 获取对象定义的行号。
inspect.getclasstree(classes, unique=False): 获取类的继承树。
inspect.indent(s): 根据对象的嵌套层级添加缩进。

示例:使用inspect.stack()

import inspectdef grandparent():parent()def parent():child()def child():for frame_record in inspect.stack():caller_frame = frame_record[0]info = inspect.getframeinfo(caller_frame)print(f"Function '{info.function}' called at line {info.lineno} of file {info.filename}")grandparent()

这个示例将演示如何使用inspect.stack()跟踪函数调用堆栈,并获取每一帧调用的信息,如函数名、文件名和行号。
inspect模块极大地提升了Python代码反射的能力,有助于调试、API文档生成以及理解代码的结构和行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es关闭开启除了系统索引以外的所有索引

1、es 开启 “删除或关闭时索引名称支持通配符” 功能 2、kibanan平台执行 POST *,-.*/_close 关闭索引POST *,-.*/_open 打开索引3、其他命令 DELETE index_* // 按通配符删除以index_开头的索引 DELETE _all // 删除全部索引 DELETE *,-.* 删除全…

鸿蒙OpenHarmony开发板解析:【系统能力配置规则】

如何按需配置部件的系统能力 SysCap&#xff08;SystemCapability&#xff0c;系统能力&#xff09;是部件向开发者提供的接口的集合。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 部件配置系统…

Java入门——类和对象(上)

经读者反映与笔者考虑&#xff0c;近期以及往后内容更新将主要以java为主&#xff0c;望读者周知、见谅。 类与对象是什么&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对…

c#文心接口应用举例

"文心接口" 通常不是 C# 语言或生态系统中直接的一个术语&#xff0c;但我猜你可能是在提及百度的一个AI平台或API&#xff0c;比如百度的文心一言&#xff08;ERNIE Bot&#xff09;或其他与AI和NLP&#xff08;自然语言处理&#xff09;相关的服务。由于具体的文心…

DDOS攻击实战演示,一次DDOS的成本有多低?

DDoS攻击成本概览 分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其低廉的启动成本和惊人的破坏力著称。攻击者通过黑市轻松获取服务&#xff0c;成本从几十元人民币的小额支出到针对大型目标的数千乃至数万元不等。为了具体理解这一成本结构&#xff0c;我们将通过一个简…

机器学习【如何学习】

如何学习机器学习 机器学习是一门快速发展的学科&#xff0c;学习机器学习需要掌握一定的数据基础和编程能力。但是很多人一听到数学就头大&#xff0c;就退缩&#xff0c;导致想要学习的新已经有两三年了&#xff0c; 但是学习的行动一直在心里&#xff0c;迟迟没有落地&…

常见的TypeScript类型注解符号

1、: 用途: 用于指定类型。放在变量名或函数参数后面&#xff0c;紧接着是类型。 示例: let name: string "Alice";2、string, number, boolean, void, null, undefined 用途: 基本数据类型。分别表示字符串、数字、布尔值、无返回值、空值和未定义。 示例: func…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

机器学习-12-sklearn案例03-flask对外提供服务

整体思路 训练一个模型&#xff0c;把模型保存 写一个基于flask的web服务&#xff0c;在web运行时加载模型&#xff0c;并在对应的接口调用模型进行预测并返回 使用curl进行测试&#xff0c;测试通过 再创建一个html页面&#xff0c;接受参数输入&#xff0c;并返回。 目录结…

Java使用equals和==的区别

对于在范围 -128 到 127 之间的数值&#xff0c;Java 会使用缓存的 Integer 对象。因此&#xff0c;这些数值的 Integer 对象可以使用 进行比较。 对于不在这个范围的数值&#xff0c;Java 每次可能创建一个新的 Integer 对象。这样&#xff0c;即使两个 Integer 对象代表相同…

CSS悬浮动画

<button class"btn">悬浮动画</button>.btn {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);padding: 10px 20px;width: 200px;height: 50px;background-color: transparent;border-radius: 5px;border: 2px solid powderblu…

C++继承深入解析

目录标题 1. 继承的基本概念1.1 为什么使用继承1.2 继承的语法 2. 继承的类型2.1 公共继承&#xff08;Public Inheritance&#xff09;公共继承的特性公共继承的语法公共继承的实际应用 2.2 保护继承&#xff08;Protected Inheritance&#xff09;保护继承的特性保护继承的语…

R2S+ZeroTier+Trilium

软路由使用ZeroTier搭建远程笔记 软路由使用ZeroTier搭建远程笔记 环境部署 安装ZeroTier安装trilium 环境 软路由硬件&#xff1a;友善 Nanopo R2S软路由系统&#xff1a;OpenWrt&#xff0c;使用第三方固件nanopi-openwrt。内网穿透&#xff1a;ZeroTier。远程笔记&…

银河麒麟操作系统 v10 离线安装 Docker v20.10.9

1查看系统版本 [rootweb-0001 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Tercel)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Tercel)" ANSI_COLOR"…

pyqt动画效果放大与缩小

pyqt动画效果放大与缩小 QPropertyAnimation介绍放大与缩小效果代码 QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c;例…

服务器2080ti驱动的卸载与安装

服务器2080ti驱动的卸载与安装 前言1、下载驱动2、驱动卸载与安装2.1 卸载原来驱动2.2 安装新驱动 3、查看安装情况 前言 安装transformers库&#xff0c;运行bert模型时出错&#xff0c;显示torch版本太低&#xff0c;要2.0以上的&#xff0c;所以更新显卡驱动&#xff0c;重…

基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)全网首发【图像识别-天气分类】

一个能够从给定的环境图像中自动识别并分类天气&#xff08;如晴天、多云、雨天、雪天闪电等&#xff09;的系统。 技术栈&#xff1a; 深度学习框架&#xff1a;PyTorch基础模型&#xff1a;VGG16与EfficientNet任务类型&#xff1a;计算机视觉中的图像分类 模型选择 VGG16 …

1.基于python的单细胞数据预处理-归一化

目录 归一化的引入移位对数皮尔森近似残差两个归一化方法的总结 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 归一化的引入 在质量控制中&#xff0c;已经从数据集删除了低质…

【网络安全】一次sql注入问题的处理

目录 问题 10.60.100.194&#xff0c;修改之前 修改方案 问题解决 测试过程 问题思考与总结 问题 一次sql注入问题的筛查报告&#xff0c;主要是sql注入的问题资源-CSDN文库 doc-new\20-设计文档\34-Mesh设备管理\100-网络安全 10.60.100.194&#xff0c;修改之前 修改…

Multitouch for Mac:手势自定义,提升工作效率

Multitouch for Mac作为一款触控板手势增强软件&#xff0c;其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch&#xff0c;用户可以轻松设置各种手势&#xff0c;如三指轻点、四指左右滑动等&#xff0c;来执行常见的任务&#xff0c;如打开应用、切换窗口、滚…