9

空白、セミコロン、バックスラッシュの継続、コメントなどを除いて、 2 つの 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 に答える