2016-11-30 5 views
4

私はopenstack/banditを使用して静的コード解析を行っています。たくさんのリポジトリを持っていますが、それらのうちのいくつかはPythonの他のPythonに2つあります。コードがPython 3と構文的に互換性があるかどうかを、コードを実行せずにどのように検出できますか? 2to3はツールが任意の差分出力した場合コードがPython 3と互換性があるかどうかを検出する方法

答えて

2

ここで一つのことは、あなたがmighですしたくない。コードが少なくとも構文的に互換性があるかどうかを知る最も簡単な方法だと思います。

python3プログラムが(実行せずに)pythonモジュールをロードしましたか?コードに互換性がある場合はモジュールをロードし、そうでなければ構文エラーを発生させます。

astモジュールを使用してください。

def test_source_code_compatible(code_data): 
    try: 
     return ast.parse(code_data) 
    except SyntaxError as exc: 
     return False 

ast_tree = test_source_code_compatible(open('file.py').read()) 
if not ast_tree: 
    print("File couldn't get loaded") 

コードをロードできない場合、SyntaxErrorエラーが発生します。抽象構文木をロードできない場合Ast Module

ドキュメントは、あなたはのpython3またはその動作を変更する方法に存在していないpython2方法をチェックする必要があります。

例えば、python3とpython2の除算は、異なる方法で動作します。 Python2では、除算は整数で分割されるので、同じ除算スキームを使用しないと除算の結果は異なります。その場合、モジュールがfrom __future__ import divisionをインポートしている場合、python2とpython3で同じ動作をするかどうか調べなければなりません。

ここでは、処理したいかもしれないものの完全なリストです:

http://python-future.org/compatible_idioms.html

すぐに絶対的に働くことができないものをあなたに与えるモジュールのASTのロードが..しかし、コードかどうかを知りますそれはpython3で動作する解析されることができます多くの偽陽性の対象です。実際にコードを実行して結果を比較することなく、コードが実際にpython2と3で100%動作するかどうかを正確に検出することは、困難でもありません。

+0

コードに互換性がある場合は、モジュールを読み込み、すべてのトップレベルコードをそのモジュール。 – vaultah

+0

@vaultahそれはばかげている。私は_それらを実行することなく書いていませんでしたか? –

+2

あなたはそれらを読み込む方法を書いてください。 –

8

基本的な検証は次のようになりa.pyのような単純なファイルの

(複数の基本的な使用のためのhttps://docs.python.org/3/library/2to3.html。):

import urllib2 

print "printing something" 

はあなたが取得したい:

> 2to3 a.py

RefactoringTool: Skipping optional fixer: buffer 
RefactoringTool: Skipping optional fixer: idioms 
RefactoringTool: Skipping optional fixer: set_literal 
RefactoringTool: Skipping optional fixer: ws_comma 
RefactoringTool: Refactored a.py 
--- a.py (original) 
+++ a.py (refactored) 
@@ -1,4 +1,4 @@ 
-import urllib2 
+import urllib.request, urllib.error, urllib.parse 

-print "printing something" 
+print("printing something") 

RefactoringTool: Files that need to be modified: 
RefactoringTool: a.py 
+0

;-)同じ考えですが、何らかの理由で回答を投稿できません。 :D +1 – derM

+4

私は、Python 3のコードを入力すると多くの誤答を与えるだろうと思います。例えば、私はそれを試したところで、 'print(42)'を 'print((42))'に置き換えたいと思っています。だからあなたはdiffを見て、それがPython 2だと思いますか? –

+0

@StefanPochmannはちょうどそれがタプルとして(間違って)解釈しているようだと確信しました。'' 'print(" testing ")' ''は変更されていません – Jann

2

これにはPycharm IDEを使用できます。 pycharmエディタでpythonファイルを開くだけで、コードがPython2またはPython3と互換性がない場合は警告が表示されます。

ここでは、印刷コマンド構文の警告を示すスクリーンショットを示します。 enter image description here

+1

最小個別費用は年間89ドルです。 – SDsolar

+0

@SDsolar this future [コミュニティ版でサポート](https://www.jetbrains.com/pycharm/features/editions_comparison_matrix.html) –

関連する問題