是否有可靠的自动方式(如命令行实用程序)来检查两个Python文件是否等效模数空格,分号,反斜杠延续,注释等?换句话说,他们与翻译相同?
例如,这个:
import sys
sys.stdout.write('foo\n')
sys.stdout.write('bar\n')
Run Code Online (Sandbox Code Playgroud)
应被视为等同于此:
import sys
sys.stdout.\
write('foo\n'); sys.stdout.\
write(
'bar\n') # This is an unnecessary comment
Run Code Online (Sandbox Code Playgroud)
Joh*_*n Y 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
Run Code Online (Sandbox Code Playgroud)
您当然可以从实际文件而不是字符串文字中读取源代码.
编辑:
为了使评论有意义,我想说明我最初建议使用内置compile()
函数.然而,@ Jian发现了一个简单的案例,它处理得不好.也许它可以根据@DSM的建议进行调整,但随后解决方案变得不那么整洁了.也许不是不合理的,但如果ast
解析和转储工作得好或更好,那就更简单了.
使用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
Run Code Online (Sandbox Code Playgroud)