是否有可靠的自动方式(例如命令行实用程序)来检查两个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
答案 0 :(得分: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
解析和转储工作得好或更好,那就更直接了。
答案 1 :(得分:6)
使用python' s parser:
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
答案 2 :(得分:2)
Python包含自己的解析器。将其应用于两个文件,然后检查结果是否在结构上等效。