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))