Python内置inspect库保姆级教程 | 查看源码、解析函数参数、反射对象(一键复制运行)
文章标签: #Python #inspect #Python反射 #Python内置库 #代码调试
阅读建议:全文代码均可直接复制运行,零基础也能看懂,日常开发、框架源码阅读、接口自动化必备工具库🔥
📌 目录
一、inspect库介绍
inspect 是 Python原生内置标准库,无需pip安装,专门用于运行时反射、探测Python对象信息。
平时开发经常遇到这些痛点:
想看别人封装函数的入参结构,不想翻源码文件
动态获取函数参数,做自动化接口、动态传参
快速查看第三方库源码,排查bug
运行时判断当前对象是函数、类还是内置方法
以上所有场景,inspect一行代码全部搞定,是Python高阶开发必备神器。
二、环境说明
Python版本:Python3.6+ 全部兼容
安装方式:无需安装,原生自带
导入方式:
import inspect
三、功能1:判断各类对象类型
日常开发中可以精准区分:普通函数、类、实例方法、内置函数、模块。
示例代码
import inspect
# 自定义测试函数
def test_func(a, b):
"""加法测试函数"""
return a + b
# 自定义测试类
class TestClass:
def run(self):
pass
if __name__ == '__main__':
obj = TestClass()
print("是否为普通函数:", inspect.isfunction(test_func))
print("是否为类:", inspect.isclass(TestClass))
print("是否为模块:", inspect.ismodule(inspect))
print("是否为实例方法:", inspect.ismethod(obj.run))
print("是否为系统内置函数:", inspect.isbuiltin(print))
运行结果
是否为普通函数: True
是否为类: True
是否为模块: True
是否为实例方法: True
是否为系统内置函数: True
四、功能2:解析函数签名、获取全部入参
高频实用功能:动态获取函数参数名、参数默认值、位置参数/可变参数类型,写装饰器、动态传参必用。
示例代码
import inspect
def user_info(name, age=18, *args, **kwargs):
"""获取用户信息"""
print(name, age)
if __name__ == '__main__':
# 获取函数完整签名
sig = inspect.signature(user_info)
print("函数完整签名:", sig)
# 获取所有参数对象
params = sig.parameters
print("\n===== 详细参数信息 =====")
for param_name, param_info in params.items():
print(f"参数名:{param_name} | 参数类型:{param_info.kind} | 默认值:{param_info.default}")
# 单独提取所有参数名列表
print("\n纯参数名列表:", list(params.keys()))
运行结果
函数完整签名: (name, age=18, *args, **kwargs)
===== 详细参数信息 =====
参数名:name | 参数类型:POSITIONAL_OR_KEYWORD | 默认值:<class 'inspect._empty'>
参数名:age | 参数类型:POSITIONAL_OR_KEYWORD | 默认值:18
参数名:args | 参数类型:VAR_POSITIONAL | 默认值:<class 'inspect._empty'>
参数名:kwargs | 参数类型:VAR_KEYWORD | 默认值:<class 'inspect._empty'>
纯参数名列表: ['name', 'age', 'args', 'kwargs']
五、功能3:一键查看源码,不用翻项目文件
阅读源码神器:不管是自己写的函数,还是第三方库源码,直接一行代码打印完整源码。
示例代码
import inspect
import os
def add_num(x, y):
"""两数相加"""
return x + y
if __name__ == '__main__':
print("===== 自定义函数源码 =====")
print(inspect.getsource(add_num))
print("===== 系统库os.path.join源码 =====")
print(inspect.getsource(os.path.join))
💡 使用技巧:看不懂第三方框架方法怎么用?直接传入方法对象,一秒看底层源码,排错效率翻倍!
六、功能4:快速获取函数/类注释文档
自动提取规范的docstring文档注释,比直接使用__doc__更干净,会自动去除多余空行。
示例代码
import inspect
class Student:
"""
学生信息实体类
存储学生姓名和年龄
"""
def __init__(self, name):
"""初始化学生姓名"""
self.name = name
if __name__ == '__main__':
print("类文档注释:")
print(inspect.getdoc(Student))
print("\n初始化方法注释:")
print(inspect.getdoc(Student.__init__))
七、功能5:获取代码所在物理文件路径
快速定位某个模块、函数到底在电脑哪个位置,排查包导入冲突非常好用。
import inspect
import json
if __name__ == '__main__':
print("json模块所在路径:", inspect.getfile(json))
print("inspect库自身路径:", inspect.getfile(inspect))
八、功能6:遍历类里面所有属性和方法
自动扫描一个类内部所有成员,批量获取方法名、变量名,适合做自动化反射。
import inspect
class DemoClass:
count = 100
title = "测试反射"
def func_one(self):
pass
def func_two(self):
pass
if __name__ == '__main__':
member_list = inspect.getmembers(DemoClass)
print("当前类全部成员:")
for name, val in member_list:
if not name.startswith("__"):
print(name)
九、inspect高频方法速查表(建议收藏)
十、全文整合代码(直接python运行)
下方代码复制保存为 inspect_demo.py,直接终端执行 python inspect_demo.py 即可一次性跑完所有案例。
# -*- coding: utf-8 -*-
import inspect
# 测试函数
def test_func(a, b=10):
"""测试加法函数"""
return a + b
# 测试类
class TestClass:
"""测试实体类"""
def test_method(self):
"""内置测试方法"""
pass
if __name__ == '__main__':
print("========== 1. 判断对象类型 ==========")
print("是否是函数:", inspect.isfunction(test_func))
print("是否是类:", inspect.isclass(TestClass))
print("\n========== 2. 获取函数参数签名 ==========")
sig = inspect.signature(test_func)
print("函数签名:", sig)
print("参数列表:", list(sig.parameters.keys()))
print("\n========== 3. 打印源码 ==========")
print(inspect.getsource(test_func))
print("\n========== 4. 获取注释 ==========")
print(inspect.getdoc(test_func))
print("\n========== 5. 获取库文件路径 ==========")
print(inspect.getfile(inspect))
十一、总结
inspect 是Python原生反射库,零依赖,开箱即用
核心三大场景:动态解析参数、在线查看源码、运行时判断对象类型
写装饰器、接口自动化、动态调用函数、阅读框架源码必备工具
所有代码开箱即用,无需额外修改,适合新手直接上手