从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>
链接
pss - 用于源文件的文件类型感知grep,带颜色,公有领域
redhawk - AST感知grep,BSD许可证
PythonJS - 使用AST的Python到JavaScript翻译器,许可证BSD-3
astviewer - MIT许可证的Qt (PySide) 下的ASTree查看器
snakefood - Python依赖图
http://eli.thegreenplace.net/2014/07/29/ast-matchers-and-clang-refactoring-tools/
https://julien.danjou.info/blog/2015/python-ast-checking-method-declaration
python-ideas - 关于静态模块/包检查的原始邮件,引发了这一切
python-static-type-checking - 关于Python程序静态分析的群组
issue19557 关于Python错误跟踪器上不完整的官方AST文档
更改
- 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)