私はopenstack/banditを使用して静的コード解析を行っています。たくさんのリポジトリを持っていますが、それらのうちのいくつかはPythonの他のPythonに2つあります。コードがPython 3と構文的に互換性があるかどうかを、コードを実行せずにどのように検出できますか? 2to3はツールが任意の差分出力した場合コードがPython 3と互換性があるかどうかを検出する方法
答えて
ここで一つのことは、あなたが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%動作するかどうかを正確に検出することは、困難でもありません。
基本的な検証は次のようになり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
- 1. Python 2と3の互換性のある方法intern()を呼び出す
- 2. web.py Python 3は互換性がありますか?
- 3. storm Python 3は互換性がありますか?
- 4. Python - どのバージョンのスクリプトと互換性がありますか?
- 5. 値がSqlDbTypeと互換性があるかどうかを知る/チェックする方法?
- 6. ネットワークカードが特定のネットワークカードと互換性があるかどうかを予測する方法
- 7. iPhoneアプリがインドのIPv6専用ネットワークと互換性があるかどうかを確認する方法
- 8. CPUがARM v5 CPU命令と互換性があるかどうかを調べる方法
- 9. .next()は、Python 2と3の両方と互換性があります。
- 10. アプリがすべてのデバイスで互換性があるかどうかを確認する方法は?
- 11. このSQLiteベースのPythonコードはMySQLと互換性がありますか?
- 12. AndroidAnnotations 3.xと互換性のあるORMLiteコードAndroidAnnotations 4.0.0
- 13. どのXcodeエクスポートメソッドがDeviceFarmと互換性がありますか?
- 14. どのsvg-libraryがinteract.jsと互換性がありますか?
- 15. コードはIEと互換性がありませんか?
- 16. pushState関数のブラウザ非互換性を検出する方法
- 17. ブラウザファイルの互換性を検出する
- 18. HTML5関連の方言はThymeleaf 3と互換性がありますか?
- 19. Doc2VecモデルPython 3との互換性
- 20. backports_abcはPython 3.6と互換性がありませんか?
- 21. Jython 2.5.1はPython 2.7と互換性がありませんか?
- 22. IronPython 3との互換性
- 23. は、Subsonic 3がMonoの最新リリースと互換性がありますか?
- 24. Python 2 + 3互換コード:6を避けるべきですか?
- 25. iPhoneアプリが後方互換性があるかどうかを確認するツール
- 26. 他のバージョンのJavaと互換性のあるコードをリンクする方法
- 27. VBAコードを64ビットExcelと互換性のある方法にするには?
- 28. BlackfishデータベースとTSQLとはどのように互換性がありますか?
- 29. ActivePerlとCPANモジュールとはどのように互換性がありますか?
- 30. サイト上のコードがQRコードでアクセスしたかどうかを検出する方法はありますか?
コードに互換性がある場合は、モジュールを読み込み、すべてのトップレベルコードをそのモジュール。 – vaultah
@vaultahそれはばかげている。私は_それらを実行することなく書いていませんでしたか? –
あなたはそれらを読み込む方法を書いてください。 –