静态分析Python模块以查找分配

时间:2011-04-14 21:43:48

标签: python code-analysis abstract-syntax-tree

我想让我的用户编写一个__init__.py模块,如下所示:

'''
This is the simpack's docstring.

Bla bla bla.
'''

name = 'Name of the simpack'

tags = ['list', 'of', 'simpack-tags']

__version__ = '0.9.3'

我希望我的程序能够获得所有这些东西:文档字符串,名称,标签和版本。但我想在不导入模块的情况下这样做,因为__init__.py可能导入整个包可能很重。 (我想为许多沉重的小事做这个过程。)

我们可以假设用户不会做任何计算上比简单的文字分配更复杂的事情。

我听说ast模块做了这样的事情。但是,我还希望能够对编译的文件执行此过程,例如__init__.pyc__init__.pyo,我不知道如何使用ast模块执行此操作。

ast模块可以在源文件和编译文件上执行此操作吗?怎么做?否则,是否有比ast更适合的工具?

2 个答案:

答案 0 :(得分:2)

您提出的难点和缺乏健壮性...... ast组件可能会在您的代码中引入版本依赖项。

替代方案:让用户编写thepackage/__init__.py[co]?,而不是尝试分析thepackage/userconfig.py。然后,您可以执行import thepackage.userconfig而无需导入thepackage

的全部内容

答案 1 :(得分:0)

另一种方法是使用两个步骤:

  • 在创建源代码压缩包,鸡蛋等期间以易于阅读的格式(例如* .egg-info文件)生成元数据。此步骤导入__init__.py文件。此步骤由用户操作触发,例如setup.py sdist
  • 阅读此元数据。此步骤不会导入任何内容。它仅处理简单的文本文件