2016-10-21 10 views
0

Как я могу статически определить, поддерживает ли исходный файл Python Python 3?Как статически определить, поддерживает ли исходный файл python 3, для flake8?

Вопрос может быть невозможно ответить, как указано там, так что я буду более конкретно:

Моя заявка на это, чтобы выбрать версию flake8 для запуска, которая не будет давать ложные SyntaxErrors. По этой причине я ищу (по крайней мере) некоторую эвристику, которая скажет мне, должен ли я запускать копию Python 3 из flake8 или копию Python 2.

Я использую flake8 из своего редактора, который показывает мне ошибки lint, когда я печатаю, и меня больше всего беспокоит тот факт, что иногда я теряю именованные ошибки (такие как F821), как побочный эффект pyflakes/flake8 считает, что что-то является синтаксической ошибкой, которая на самом деле является правильным синтаксисом: когда он сталкивается с синтаксической ошибкой, он (понятно), похоже, отказывается от таких вещей, как именование ошибок.

+0

Это не может быть. Слишком много кодировок для тестирования. –

+0

'if re.findall (" print [^ (] + ['\ "], file_text)> 0: напечатать« PY2 »' ... хотя это, вероятно, не гарантирует, что он всегда прав ... –

+1

@JoranBeasley: 'из __future__ import print_function' или просто кто-то, использующий' print (...) 'как само собой разумеющееся для одиночных значений. –

ответ

2

Это почти невозможно. Есть слишком много кодировок для тестирования.

Кроме того, можно написать код для запуска на как Python 2 и 3, и flake8 не всегда, как уловок, используемых, чтобы сделать это возможным, если проект специально не испытывает с flake8 и пометил такие сайты, чтобы Исключенный. Таким образом, вы можете либо иметь ложных срабатываний (ошибки как в версиях python 2, так и в Python 3 flake8), или код будет просто работать на Python 2 и 3 без каких-либо предупреждений.

Вы можете использовать tox для управления версиями для данного проекта; есть токсикодендрон выяснить, что flake8 команду использовать (может быть несколько):

[tox] 
envlist = py27,py35,flake8-27,flake8-35 

# ... 
[testenv:flake8-27] 
basepython=python2.7 
deps=flake8 
commands= 
flake8 projectdir 

[testenv:flake8-35] 
basepython=python3.5 
deps=flake8 
commands= 
flake8 projectdir 

и использовать tox -e flake8-27 или tox -e flake8-35.

+0

Трудная вещь здесь в том, что flake8, кажется, прекращает излучать, например, неопределенное имя F821 - это, как правило, находка, отправленная pyflakes/flake8 - когда она попадает в SyntaxError. Поэтому кажется, что невероятно полезная функция может быть потерянный, бесшумно, при работе с 2 против 3? Любые советы по этой конкретной проблеме? –

+0

@CroadLangshan: исключение SyntaxError делает недействительным весь файл, файл не может быть проанализирован ни во что, что позволит провести дальнейший анализ. об этом, боюсь. Не имеет ли чешуйки кодов выхода? –

0

Если вы только заботиться о SyntaxError (который вы конкретно указать в вашем вопросе), вы можете просто попытаться скомпилировать файл с Python 2 и 3:

python -m compileall 
python3 -m compileall 

Если какая-либо из этих команд не удается, в что код не работает с этой версией Python. Обратное, конечно, неверно: если код компилируется в определенной версии Python, это не гарантирует, что он будет корректно работать в этой версии Python. Он просто говорит вам, что нет SyntaxError s.

+0

Я знаю, что вы все еще можете получить синтаксическую ошибку при использовании 'eval()' или 'exec()', поэтому не нужно указывать это в комментарии. :) –