总结
豆包 AI 助手文章总结

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

下次还敢
发布: 2025-06-08 22:21:03
原创
518人浏览过

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。你可以基于这些信息做更智能的参数处理,比如验证类型、生成文档等。

关键点:

  • 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,比如ismethod、ismethoddescriptor等来筛选不同的成员。

常见用途包括:

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

以上就是Python中inspect模块 代码自省inspect的元编程实用技巧的详细内容,更多请关注php中文网其它相关文章!

豆包AI编程
豆包AI编程

智能代码生成与优化,高效提升开发速度与质量!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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