2016-10-21 2 views
0

Comment puis-je déterminer de manière statique si un fichier source Python prend en charge Python 3?Comment déterminer statiquement si un fichier source supporte python 3, pour flake8?

La question est peut-être impossible de répondre comme il est dit là-bas, donc je vais être plus précis:

Ma demande est de choisir une version de flake8 pour exécuter qui ne donnera pas SyntaxErrors parasites. Pour cette raison, je cherche (au moins) une heuristique qui me dira si je devrais exécuter une copie Python 3 de flake8, ou une copie de Python 2. J'utilise flake8 de mon éditeur, ce qui me montre des erreurs de lint comme je tape, et je suis plus préoccupé par le fait que parfois je perds les erreurs de nommage (comme F821), comme un effet secondaire de pyflakes/flake8 pense que quelque chose est une erreur de syntaxe qui est en fait une syntaxe correcte: quand il rencontre une erreur de syntaxe, il semble (compréhensible) qu'il abandonne des choses comme des erreurs de nommage.

+0

Ceci est presque impossible. Il y a trop de chemins de code à tester. –

+0

'si re.findall (" print [^ (] + ['\ "], file_text)> 0: affiche" PY2 "' ... bien que cela ne garantira probablement pas que c'est toujours correct ... –

+1

@JoranBeasley: 'from __future__ import print_function', ou simplement quelqu'un qui utilise' print (...) 'pour des valeurs simples, bien sûr –

Répondre

2

Ceci est presque impossible. Il y a beaucoup trop de chemins de code à tester.

De plus, le code peut être écrit pour fonctionner sur les deux Python 2 et 3, et flake8 ne pas toujours les astuces utilisées pour que cela soit possible, à moins que le projet teste spécifiquement flake8 et a marqué ces sites à exclu. Vous pouvez donc avoir faux positifs (erreurs dans les versions Python 2 et Python 3 de flake8) ou le code fonctionnera simplement sur Python 2 et 3 sans aucun avertissement.

Vous pouvez utiliser tox pour gérer le support de version pour un projet donné à la place; ont tox savoir quelle commande flake8 à utiliser (qui peut être multiple):

[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 

et utiliser tox -e flake8-27 ou tox -e flake8-35.

+0

Le problème est que flake8 semble arrêter d'émettre par exemple F821 undefined name - qui est normalement une aubaine envoyée par pyflakes/flake8 - quand il frappe un SyntaxError.Il semble que cette fonctionnalité incroyablement utile peut être perdu, en silence, lorsqu'il s'agit de 2 vs 3? –

+0

@CroadLangshan: une exception SyntaxError invalide le fichier entier, le fichier ne peut être analysé dans tout ce qui permettra une analyse plus approfondie. à ce sujet, j'ai peur. Est-ce que flake8 n'a pas de code de sortie? –

0

Si vous ne vous préoccupez SyntaxError (que vous mentionnez spécifiquement dans votre question), vous pouvez simplement essayer de compiler le fichier avec Python 2 et 3:

python -m compileall 
python3 -m compileall 

Si l'une de ces commandes échoue, vous en le moins savoir que le code ne fonctionne pas avec cette version de Python. L'inverse n'est bien sûr pas vrai: si le code compile dans une version spécifique de Python, cela ne vous garantit pas qu'il fonctionnera correctement dans cette version de Python. Il vous dit qu'il n'y a pas de SyntaxError s.

+0

Je sais que vous pouvez toujours obtenir une erreur de syntaxe en utilisant 'eval()' ou 'exec()', donc pas besoin de le signaler dans un commentaire. :) –