0

0

Python中inspect模块 代码自省inspect的元编程实用技巧

下次还敢

下次还敢

发布时间:2025-06-08 22:21:03

|

683人浏览过

|

来源于php中文网

原创

inspect模块在python中用于分析和操作代码结构,能获取函数名、调用栈、参数签名、类成员及源码等信息。1.使用inspect.stack()可获取调用栈信息,如当前函数被谁调用;2.inspect.signature()可动态分析函数参数,适用于编写通用装饰器;3.inspect.getmembers()可用于检查类的方法与属性;4.inspect.getsource()等函数可读取源码或文档字符串,适合生成文档或调试。这些功能在元编程、框架开发和调试中非常实用。

在Python中,inspect模块是一个非常强大的工具,它能让你“看穿”代码本身。尤其是在做元编程、调试或者写框架时,掌握一些inspect的实用技巧可以帮你省去不少麻烦。

下面几个场景,就是你在日常开发中可能会遇到的问题,以及如何用`inspect模块巧妙解决的方法。


获取当前函数名或调用栈信息

有时候你想知道某个函数被谁调用了,或者想打印出当前执行的函数名用于调试,这时候就可以用inspect.stack()

import inspect

def who_called_me():
    caller = inspect.stack()[1]
    print(f"被 {caller.function} 在第 {caller.lineno} 行调用")

def test():
    who_called_me()

test()

这样你就能快速定位到是谁调用了这个函数。这在调试大型项目的时候特别有用,尤其是当你不确定某个函数是从哪里被触发的。

立即学习Python免费学习笔记(深入)”;

常用操作:

  • inspect.currentframe():获取当前帧对象
  • inspect.getouterframes():获取调用栈的所有帧
  • inspect.getframeinfo():获取帧的信息,比如文件名、行号等

动态分析函数参数和签名

你有没有遇到过这样的情况:你写了一个装饰器,但希望它能自动适配不同参数的函数?这时候inspect.signature()就派上用场了。

from inspect import signature

def my_decorator(func):
    sig = signature(func)
    print(f"函数 {func.__name__} 的参数是:{sig}")
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def example(a, b=2):
    pass

输出结果会告诉你这个函数有两个参数,一个是必填的a,一个是默认值为2的b。你可以基于这些信息做更智能的参数处理,比如验证类型、生成文档等。

Sesame AI
Sesame AI

一款开创性的语音AI伴侣,具备先进的自然对话能力和独特个性。

下载

关键点:

  • signature.parameters:返回一个有序字典,包含所有参数
  • 可以判断参数类型(positional-only、keyword-only、varargs等)
  • 适用于编写通用性强的装饰器或插件系统

检查类和对象的结构信息

如果你在做反射或者动态加载模块,可能需要检查一个类有哪些方法、属性,或者判断一个对象是否是某种类型。

import inspect

class MyClass:
    def method_one(self):
        pass

    def method_two(self):
        pass

methods = inspect.getmembers(MyClass, predicate=inspect.isfunction)
print(methods)

这段代码会列出MyClass中的所有方法。你也可以换成其他predicate,比如ismethodismethoddescriptor等来筛选不同的成员。

常见用途包括:

  • 自动生成API文档
  • 构建插件系统(自动发现模块中的类或方法)
  • 调试时查看对象内部结构

查看源码和注释内容

你还可以用inspect直接读取函数或类的源码,这对于调试或生成文档很有帮助。

import inspect

def sample_func(x: int, y: str) -> bool:
    """示例函数"""
    return x > 0 and y != ""

source = inspect.getsource(sample_func)
print(source)

除了getsource,还有几个相关函数:

  • getdoc():获取对象的文档字符串(docstring)
  • getcomments():获取源码顶部的注释
  • getfile():获取定义该对象的文件路径

这对自动生成文档、分析代码结构非常有帮助,尤其适合写自动化工具链时使用。


基本上就这些。虽然inspect模块看起来不是每天都要用的东西,但在做一些高级功能(比如写框架、自动化测试、调试工具)时,它确实能帮你节省不少时间。关键是理解它的各个函数能做什么,然后根据实际需求灵活组合使用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

192

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Rust 教程
Rust 教程

共28课时 | 6.8万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号