比较Python代码的等价性

Jia*_*ian 9 python

是否有可靠的自动方式(如命令行实用程序)来检查两个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解析和转储工作得好或更好,那就更简单了.


And*_*den 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
Run Code Online (Sandbox Code Playgroud)