9

是否有可靠、自动的方法(例如命令行实用程序)来检查两个 Python 文件是否是等效的模空格、分号、反斜杠延续、注释等?换句话说,它们与解释器相同吗?

例如,这个:

import sys
sys.stdout.write('foo\n')
sys.stdout.write('bar\n')

应该被认为等同于:

import   sys
sys.stdout.\
    write('foo\n'); sys.stdout.\
    write(

    'bar\n') # This is an unnecessary comment
4

3 回答 3

14

使用ast模块。

示例(对于 Python 2):

import ast

x = r'''import sys
sys.stdout.write('foo\n')
sys.stdout.write('bar\n')'''

y = r'''import   sys
sys.stdout.\
    write('foo\n'); sys.stdout.\
    write(

    'bar\n') # This is an unnecessary comment'''

xd = ast.dump(ast.parse(x))
yd = ast.dump(ast.parse(y))
print xd == yd

您当然可以从实际文件而不是字符串文字中读取源代码。

编辑:

为了使评论有意义,我想指出我最初建议使用内置compile()函数。但是,@Jian 发现了一个处理不好的简单案例。正如@DSM 所建议的那样,也许可以对其进行调整,但随后解决方案变得不那么整洁了。也许不是不合理,但如果ast解析和转储工作得一样好或更好,这是更直接的方法。

于 2012-11-07T22:12:34.027 回答
6

使用 python 的解析器

In [1]: import parser

In [2]: with open('file1.py', 'r') as f1:
    st1 = parser.suite(f1.read())

In [3]: with open('file2.py', 'r') as f2:
    st2 = parser.suite(f2.read())

In [4]: st1.compile() == st2.compile()
Out[4]: True
于 2012-11-07T22:18:33.070 回答
2

Python 包含自己的解析器。将其应用于两个文件,然后检查结果在结构上是否相同。

于 2012-11-07T21:53:37.913 回答