Python inspect模块
时间:2020-02-23 14:42:49 来源:igfitidea点击:
Python 检查模块
Pythoninspect
模块是非常有用的模块,用于对程序中的活动对象进行自检,并查看整个程序中使用的模块,类和函数的源代码。
这功能强大,因为此模块实际上可以用于提取函数本身的源代码,解析该函数接受的参数以及相关的库文档。
提供示例 模块
为了获得在本程序中使用的示例,我们将构建一个非常小的示例模块,其中包含一些函数,类和Python文档字符串。
这是sample.py
的代码片段:
def module_funct(arg1, arg2 = 'default', *args): """This is a module-level function.""" local_var = arg1 * 3 return local_var class X(object): """Definition for X class.""" def __init__(self, name): self.name = name def get_name(self): "Returns the name of the instance." return self.name x_obj = X('sample_instance') class Y(X): """This is the Y class, child of X class. """ # This method is not part of X class. def do_something(self): """Anything can be done here.""" def get_name(self): "Overrides version from X" return 'Y(' + self.name + ')'
现在,我们已经准备好使用示例模块,我们可以开始提取并自检其源代码,文档字符串和对象详细信息。
让我们开始吧。
inspect模块
让我们从内省我们定义的示例模块开始。
请注意,为此,我们其中执行脚本的目录中有示例模块文件" sample.py"。
这是有关如何检查模块的示例代码片段:
import inspect import sample for name, data in inspect.getmembers(sample): if name.startswith('__'): continue print('{} : {!r}'.format(name, data))
inspect模块中的类
我们可以获取模块中存在的所有类,并在找到所需的类时采取行动:
import inspect import sample for key, data in inspect.getmembers(sample, inspect.isclass): print('{} : {!r}'.format(key, data))
借助于'isclass'属性的简单标识,我们能够得到模块的类。
类中的inspect方法
这次,我们通过检查类中存在的方法来做更深入的研究。
请注意,我们使用相同的方法getmembers
,只是属性标识符不同,即isfunction
:
import inspect from pprint import pprint import sample pprint(inspect.getmembers(sample.X, inspect.isfunction))
让我们看看该程序的输出:类的自检方法
inspect一个类的对象
使用inspect模块,可以通过单个函数调用来跟踪程序中创建的类的所有实例:
import inspect from pprint import pprint import sample x = sample.X(name='inspect_getmembers') pprint(inspect.getmembers(x, inspect.ismethod))
获取文档字符串作为类
inspect模块通常用在Python工具中,该工具可以自动提取一个类及其方法docstring,这些过程可以呈现给最终用户。
这意味着开发人员可以简单地将文档字符串放入方法中,并且相同的文档字符串也可以用于呈现给应用程序的其他开发人员,从而减少了开发人员的工作量:
import inspect import sample print('X.__doc__:') print(sample.X.__doc__) print() print('getdoc(X):') print(inspect.getdoc(sample.X))
获取程序来源
在像IDE这样的智能环境中,检查模块用于显示模块,类和函数的源代码:
import inspect import sample print(inspect.getsource(sample.Y))
获取方法来源
这次,我们仅获得单个方法的源代码:
import inspect import sample print(inspect.getsource(sample.Y.get_name))
获取方法签名
对于最后一个示例,我们将获得方法的签名,该方法的签名在IDE的Intellisense中被大量使用,以向开发人员提供方法接受的参数:
import inspect import sample print(inspect.signature(sample.module_funct))