跳转到主要内容

从Python模块中提取信息,无需导入

项目描述

在不执行的情况下从Python模块中获取信息。

这是一个用于操作Python源代码抽象语法树(AST)的工具和库。它可以用于探索AST、检查节点和处理它们。

从命令行使用时,astdump.py可以为您的模块生成setup.py或打印其结构。

什么是AST

Matthew J Desmarais有一个很好的演讲What would you do with an AST?,其中包含您可能会发现有用的信息。

astdump包提供了一个数据集,其中包含各种Python片段的AST表示生成的示例。您可以随意克隆存储库并使用代码进行实验 - 它是安全的并且受版本控制。

好奇的人可以在这里找到Python抽象树的结构定义http://hg.python.org/cpython/file/v2.7.6/Parser/Python.asdl

命令行用法

$ ./astdump.py
Usage: astdump.py [options] <filename.py>

AST dump tool to inspect Python source code without importing it. Can
extract values of top level vars, automatically generate setup.py and
dump structure of an Abstract Syntax Tree in readable format.

Options:
  -h, --help  show this help message and exit
  --topvars   get top level variables
  --generate  generate setup.py for a given filename

从Python模块中读取顶级变量,无需导入

$ ./astdump.py --topvars astdump.py
__author__ = 'anatoly techtonik <techtonik@gmail.com>'
__description__ = 'Extract information from Python module without importing it.'
__license__ = 'Public Domain'
__version__ = '3.0'

自动生成setup.py

$ ./astdump.py --generate astdump.py
#!/usr/bin/env python
from distutils.core import setup

setup(
    name = 'astdump',
    version = '3.0',
    author = 'anatoly techtonik',
    author_email = 'techtonik@gmail.com',
    description = 'Extract information from Python module without importing it.',
    license = 'Public Domain',

    py_modules=['astdump'],
)

“美化打印”AST树

$ ./astdump.py setup.py
Module
  ImportFrom
    alias
  Expr
    Call
      Name
        Load
      keyword
        Str
      keyword
        Str
      ...
      keyword
        Str
      keyword
        List
          Str
          Load

库用法

top_level_vars(filename)

返回指定为filename的脚本的顶级变量的名称/值对。仅支持字符串和整数值。

>>> import astdump
>>> astdump.top_level_vars("astdump.py")
{'__version__': '3.0', '__description__': 'Extract information from Python
module without importing it.', '__license__': 'Public Domain', '__author__
': 'anatoly techtonik <techtonik@gmail.com>'}
indented(text, printres=True)

打印指定在text变量中的Python代码的缩进AST。目标是尽可能美化地打印AST,因此输出可能会更改。如果printres为false,则返回字符串。

>>> import astdump
>>> astdump.indented('2+3')
Module
  Expr
    BinOp
      Num
      Add
      Num
dumpattrs(node, indent=0, oneline=False, output=sys.stdout)

将给定节点的属性输出到output(默认为sys.stdout)。如果设置了oneline,则格式化输出为单行。否则,按行以给定的indent输出每个属性。

>>> from astdump import dumpattrs as dat
>>> import ast
>>> root = ast.parse('2+3')
>>> root
<_ast.Module at 0x35f8790>
>>> dat(root)
body: [<_ast.Expr object at 0x035F8730>]
>>> dat(root.body[0])
value: <_ast.BinOp object at 0x035F8850>

更改

4.3 (2016-02-14)
  • 修复Python 3安装错误(问题#2)

4.2 (2014-08-15)
  • 读取setup.py生成器的__url__

4.1 (2014-08-15)
  • 如果未设置__description__,则setup.py生成器尝试使用模块文档字符串作为简短描述

4.0 (2014-06-25)
  • 修复setup.py生成器以支持Python 3(在3.3中已损坏)

  • API更改

    • TreeDumper()回调现在接收父节点堆栈而不是深度级别

    • 将TreeDumper().level重命名为TreeDumper().limit

    • 添加TreeDumper().stack列表以访问父节点

    • 将TreeDumper().depth改为只读属性,它返回堆栈的当前长度

3.3 (2014-03-21)
  • 重新编写setup.py生成器以在PyPI上查找缺失的属性,添加分类器和README read()以用于长描述

3.2 (2013-11-27)
  • API更改

    • dumpattrs(node)帮助器用于打印节点属性

3.1 (2013-11-20)
  • 修复源分发中缺失的dataset/目录

3.0 (2013-11-19)
  • 添加了dataset/目录,其中包含片段、输出示例和update.py,该脚本会重新生成它们。请参阅dataset/README.txt

  • API更改

    • 添加indented(text)以输出缩进的AST,目前只显示节点

    • indented(text, printres=False)返回字符串而不是打印

    • 默认将TreeDumper()设置为静默。它只是遍历。

  • 修复pip安装,添加MANIFEST.in,添加trove类别,感谢Jonathan Eunice(pull request #1)

2.0 (2013-11-10)
  • API更改

    • 删除–dump选项,默认情况下会输出AST

    • 添加–topvars选项以实现以前的行为

1.2 (2013-11-10)
  • 修复Python 2的默认输出(在1.1中已损坏)

1.1 (2013-09-16)
  • 支持Python 3

1.0 (2012-03-29)
  • API更改

    • get_top_vars(node)被替换为top_level_vars(filename)

发布清单

[ ] 更新astdump.py中的版本
[ ] 运行dataset/update.py以支持Python 2和3
[ ] 更新README.rst
[ ] 运行python astdump.py –generate astdump.py >setup.py
[ ] 检查setup.py是否包含Unix换行符
[ ] 运行setup.py sdist register upload
[ ] hg tag

项目详细信息


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分发

astdump-4.3.zip (19.4 kB 查看散列值)

上传时间

支持