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

发布于 2024-11-01 05:48:50 字数 603 浏览 7 评论 0原文

我想让我的用户编写一个像这样的 __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 可能会导入整个包,这可能很重。 (我想对许多重型 simpack 执行此过程。)

我们可以假设用户不会执行任何比简单的文字赋值更复杂的计算操作。

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

ast 模块可以对源文件和编译文件执行此操作吗?它是如何完成的?否则,还有比ast更合适的工具吗?

I want to let my users write an __init__.py module like this:

'''
This is the simpack's docstring.

Bla bla bla.
'''

name = 'Name of the simpack'

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

__version__ = '0.9.3'

And I want my program to be able to get all of these things: The docstring, the name, the tags and the version. But I want to do it without importing the module, because __init__.py might import the entire package which can be heavy. (I want to do this process for many heavy simpacks.)

We can assume that the user doesn't do anything computationally trickier then a simple literal assignment.

I heard that the ast module does things like this. But, I also want to be able to do this process on compiled files, e.g. __init__.pyc or __init__.pyo, and I don't know how to do this with the ast module.

Can the ast module do this on both source and compiled files? How is it done? Otherwise, is there a more fitting tool than ast?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如日中天 2024-11-08 05:48:50

您提出的建议听起来很困难且缺乏鲁棒性...... ast 组件可能会在您的代码中引入版本依赖性。

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

What you propose smells of difficulty and lack of robustness ... the ast component is likely to introduce version dependencies in your code.

Alternative: Instead of trying to analyse thepackage/__init__.py[co]?, have the users write a thepackage/userconfig.py. Then you can do import thepackage.userconfig without importing the whole contents of thepackage

我要还你自由 2024-11-08 05:48:50

另一种方法是使用 2 个步骤的过程:

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

An alternative approach is to use 2 steps process:

  • generate metadata in an easy-to-read format (such as *.egg-info files) during creation of source tarballs, eggs, etc. This step imports the __init__.py file. This step is triggered by a user action such as setup.py sdist
  • read this metadata. This step doesn't import anything. It deals only with a simple text files
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文