Я занимаюсь анализом статического кода с использованием openstack/bandit. У вас много репозиториев, некоторые из них находятся в python 2 в python 3. Как я могу определить, синтаксически совместим ли код с python 3 без запуска кода.Как определить, совместим ли код с 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
Если абстрактное дерево синтаксиса не может быть загружено, то вам, возможно, придется проверить методы python2, не существует в Python3 или методах, которые изменили свое поведение.
Например, деление на python3 и python2 работает по-разному. В python2 деление делится на целые числа, поэтому результат деления будет другим, если вы не используете одну и ту же схему разделения. В этом случае вам нужно будет посмотреть, импортирует ли модуль from __future__ import division
, чтобы иметь такое же поведение в python2 и python3.
Вот исчерпывающий список вещей, которые вы можете обращаться:
http://python-future.org/compatible_idioms.html
Загрузка AST модуля даст вам сразу то, что совершенно не может работать .. но зная код который может быть проанализирован, будет работать в python3, подлежит множеству ложных срабатываний. Трудно даже точно определить, действительно ли код будет работать на 100% в python2 и 3 без фактического запуска и сравнения результатов.
Базовая проверка будет, если инструмент 2to3 печатает любой Diffs
на простой файл как a.py (S 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
;-) Такая же идея, я просто не могу публиковать ответы по какой-то причине. : D +1 – derM
Я думаю, что это дало бы много ложных ответов при кормлении кода Python 3. Например, я просто попробовал, и он хочет заменить 'print (42)' на 'print ((42))', ouch. Итак, вы увидите diff и подумаете, что это Python 2? –
@StefanPochmann просто проверил, что, кажется, интерпретирует его (ошибочно) как кортеж.'' 'print (" testing ")' '' не изменяется – Jann
Для этого можно использовать Pycharm IDE. Просто откройте файлы python в редакторе pycharm, он покажет предупреждения, если код не совместим с Python2 или Python3.
Вот скриншот, на котором отображается предупреждение синтаксиса команды печати.
Минимальная индивидуальная стоимость составляет 89 долларов США в год. – SDsolar
@SDsolar это будущее [поддерживается в издании сообщества] (https://www.jetbrains.com/pycharm/features/editions_comparison_matrix.html) –
- 1. Совместим ли шторм Python 3?
- 2. Совместим ли с web.py Python 3?
- 3. Fig Python 3 Совместим?
- 4. Как определить, совместим ли терминал с цветом?
- 5. Python 2 и 3, байт-код (pyo & pyc) обратно совместим?
- 6. Проверьте, совместим ли код с IE 5
- 7. Совместим ли с Cherrypy Python3?
- 8. Как определить, совместим ли пакет npm с реагирующим?
- 9. Код LWJGL 2 не совместим с кодом LWJGL 3?
- 10. Какой менеджер/компрессор для Django совместим с Python 3?
- 11. Код не совместим с IE?
- 12. Совместим ли Ruby2Ruby с ParseTree?
- 13. Как проверить код совместим с Windows 7
- 14. Python IDLE совместим с многопоточным?
- 15. pip install django-graphos не совместим с python 3
- 16. Python - Скрипт совместим с какой версией?
- 17. NHibernate 3 совместим с SQL Server 2016?
- 18. Совместим ли sIFR 3 с плагином цикла jQuery?
- 19. Как определить, является ли класс абстрактным в Python 3?
- 20. Почему код совместим с материнскими платами?
- 21. LESS-build совместим с Sublime Text 3?
- 22. Совместим ли объектный код с разных языков программирования?
- 23. Является ли код для 2.21 совместим с 3.0?
- 24. В Python 3, как я могу определить, заблокирована ли Windows?
- 25. В Python 3, как определить, является ли префикс в строке?
- 26. Совместим ли mediaelement.js с Phonegap?
- 27. Совместим ли MVC5 с SimpleMembershipProvider?
- 28. Совместим ли CryptDB с ArchLinux?
- 29. Совместим ли Realm с Экспонентом
- 30. Совместим ли C99 с C89?
Если код совместим, он загрузит модуль и выполнит весь код верхнего уровня в этот модуль. – vaultah
@vaultah это смешно. Разве я не писал _ без их выполнения? –
Возможно, вам стоит написать, как вы их загрузите. –