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.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。你可以基于这些信息做更智能的参数处理,比如验证类型、生成文档等。
关键点:
如果你在做反射或者动态加载模块,可能需要检查一个类有哪些方法、属性,或者判断一个对象是否是某种类型。
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等来筛选不同的成员。
常见用途包括:
你还可以用inspect直接读取函数或类的源码,这对于调试或生成文档很有帮助。
import inspect def sample_func(x: int, y: str) -> bool: """示例函数""" return x > 0 and y != "" source = inspect.getsource(sample_func) print(source)
除了getsource,还有几个相关函数:
这对自动生成文档、分析代码结构非常有帮助,尤其适合写自动化工具链时使用。
基本上就这些。虽然inspect模块看起来不是每天都要用的东西,但在做一些高级功能(比如写框架、自动化测试、调试工具)时,它确实能帮你节省不少时间。关键是理解它的各个函数能做什么,然后根据实际需求灵活组合使用。
以上就是Python中inspect模块 代码自省inspect的元编程实用技巧的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号