Python内置inspect库保姆级教程 | 查看源码、解析函数参数、反射对象(一键复制运行)

文章标签: #Python #inspect #Python反射 #Python内置库 #代码调试

阅读建议:全文代码均可直接复制运行,零基础也能看懂,日常开发、框架源码阅读、接口自动化必备工具库🔥


📌 目录

  1. inspect库介绍

  2. 环境说明

  3. 功能1:判断对象类型

  4. 功能2:自动解析函数签名与参数

  5. 功能3:一键查看函数/类完整源码

  6. 功能4:获取文档注释说明

  7. 功能5:获取代码所在文件路径

  8. 功能6:获取类内部全部属性和方法

  9. inspect常用方法速查表

  10. 全文整合一站式运行代码

  11. 总结与使用场景


一、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高频方法速查表(建议收藏)

方法名

作用说明

inspect.isfunction()

判断是否为普通函数

inspect.isclass()

判断是否为类

inspect.ismethod()

判断是否为实例方法

inspect.signature()

获取函数完整参数签名

inspect.getsource()

获取对象完整源码

inspect.getdoc()

清洗后获取文档注释

inspect.getfile()

获取文件物理路径

inspect.getmembers()

获取类/模块全部成员


十、全文整合代码(直接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))

十一、总结

  1. inspect 是Python原生反射库,零依赖,开箱即用

  2. 核心三大场景:动态解析参数、在线查看源码、运行时判断对象类型

  3. 写装饰器、接口自动化、动态调用函数、阅读框架源码必备工具

  4. 所有代码开箱即用,无需额外修改,适合新手直接上手