比较Python代码的等价性

时间:2012-11-07 21:50:13

标签: python

是否有可靠的自动方式(例如命令行实用程序)来检查两个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

3 个答案:

答案 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包含自己的解析器。将其应用于两个文件,然后检查结果是否在结构上等效。