zoukankan      html  css  js  c++  java
  • python inspect库

    一、介绍

    inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等。

    inspect模块主要提供了四种用处:

    1. 对是否是模块、框架、函数进行类型检查
    2. 获取源码
    3. 获取类或者函数的参数信息
    4. 解析堆栈解析堆栈

    二、常用的方法

    1、getargspec(func)

    返回一个命名元组ArgSpect(args, varargs, keywords, defaults),
    args是函数位置参数名列表,varargs是*参数名,keywords是**参数名,defaults是默认参数值的元组。

    # 函数
    def f1(a, b, *args, **kwargs):
        pass
        
    argspec = inspect.getargspec(f1)
    print argspec  # ArgSpec(args=['a', 'b'], varargs='args', keywords='kwargs', defaults=None)
    print argspec.args  # ['a', 'b']
    print argspec.varargs  # args
    
    
    # 类方法
    class F():
        def f1(self, a, b, *args, **kwargs):
            pass
    
    
    argspec = inspect.getargspec(F.f1)
    print argspec  # ArgSpec(args=['self', 'a', 'b'], varargs='args', keywords='kwargs', defaults=None)
    print argspec.args  # ['self', 'a', 'b']
    print argspec.varargs  # args

    2、getsource(object)

    返回类或者函数的源码

    class F():
        def f1(self, a, b, *args, **kwargs):
            pass
    
    
    print inspect.getsource(F)
    print inspect.getsource(F.f1)

    3、getsourcelines(object)

    返回一个元组,元组第一项为对象源代码行的列表,第二项是第一行源代码的行号

    class F():
        def f1(self, a, b, *args, **kwargs):
            pass
    
    
    print inspect.getsourcelines(F)
    # (['class F():
    ', '    def f1(self, a, b, *args, **kwargs):
    ', '        pass
    '], 3)
    print inspect.getsourcelines(F.f1)
    # (['    def f1(self, a, b, *args, **kwargs):
    ', '        pass
    '], 4)

    4、getmodule(object)

    返回定义对象的模块

    class F():
        def f1(self, a, b, *args, **kwargs):
            pass
    
    
    print inspect.getmodule(F)  # <module '__main__' from 'D:/Projects/test.py'>
    print inspect.getmodule(F.f1)  # <module '__main__' from 'D:/Projects/test.py'>

    5、ismodule,isclass,ismethod,isfunction,isbuiltin

    一系列判断对象类型的方法,大都是包装了isinstance(object, types.FunctionType)之类语句的函数。

    6.getmembers(object[, predicate])

    返回一个包含对象的所有成员的(name, value)列表。返回的内容比对象的__dict__包含的内容多,源码是通过dir()实现的。
    predicate是一个可选的函数参数,被此函数判断为True的成员才被返回。

    # getmembers的源码
    def getmembers(object, predicate=None):
        """Return all members of an object as (name, value) pairs sorted by name.
        Optionally, only return members that satisfy a given predicate."""
        results = []
        for key in dir(object):
            try:
                value = getattr(object, key)
            except AttributeError:
                continue
            if not predicate or predicate(value):
                results.append((key, value))
        results.sort()
        return results
    
    # 示例
    class Foo(object):
    
        def __init__(self, name):
            self.__name = name
    
        def getname(self):
            return self.__name
    
    
    print inspect.getmembers(Foo, inspect.ismethod)
    结果:
    [('__init__', <unbound method Foo.__init__>), ('getname', <unbound method Foo.getname>)]
  • 相关阅读:
    Django 常见问题
    post和get的区别
    Django 基础学习笔记二
    Django 中的分页器
    Python 微服务框架 Nameko 微服务通信(RabbitMQ)
    《大数据白皮书 2020.12》解读
    练习Div+Css
    利用JAVAScript调用WebService
    统计在线人数和历史访问人数
    自己写的一个DBHelper
  • 原文地址:https://www.cnblogs.com/Zzbj/p/11716806.html
Copyright © 2011-2022 走看看