PEP8 – l'importation n'est pas au top de fichier sys.chemin
Problème
PEP8 a une règle à propos de mettre les importations en haut d'un fichier:
Les importations sont toujours placé au début du fichier, juste après n'importe quel module, les commentaires et les docstrings, et avant de module globals et constantes.
Toutefois, dans certains cas, j'aimerais faire quelque chose comme:
import sys
sys.path.insert("..", 0)
import my_module
Dans ce cas, le pep8
utilitaire de ligne de commande de drapeaux mon code:
E402 module niveau de l'importation n'est pas au top de fichier
Quelle est la meilleure façon d'atteindre PEP8 conformité avec sys.path
modifications?
Pourquoi
J'ai ce code parce que je suis en suivant les la structure du projet donné dans Le Routard de Python.
Qui guide suggère que j'ai un my_module
dossier, distincte d'une tests
dossier, les deux sont dans le même répertoire. Si je veux accéder à my_module
de tests
, je pense que j'ai besoin d'ajouter ..
à la sys.path
- Pourquoi ne pas vous écrire un
setup.py
et installermy_module
pour les essais? - Parce que c'est un peu moins pratique. Je suppose que j'ai pu mais je préfère ne pas.
- Pour qui? Si jamais vous voulez l'utiliser réellement ce projet partout où il est, et de loin, la façon la plus simple de l'obtenir vers le haut et en cours d'exécution.
- pour moi. Ce n'est plus un projet personnel pour mon utilisation. Je vais certainement utiliser que si pas d'autres réponses à venir.
- Si vous n'êtes pas le partage, pourquoi s'inquiéter à propos de la suite de la PEP-8 de si près?
- À partir de PEP8: "Toutefois, de savoir quand être incohérent, parfois style guide de recommandations ne sont pas applicables. En cas de doute, utilisez votre meilleur jugement.". Il ya des moments où vous devez casser PEP8 de la conformité, et c'est OK.
- C'est une bonne habitude à prendre pour l'avenir, les choses que je vais partager. (Je vois votre point bien que, dans ce cas je peux utiliser setup.py). Je vais garder cela à l'esprit.
Vous devez vous connecter pour publier un commentaire.
Souvent, j'ai plusieurs fichiers avec des tests dans un sous-répertoire
foo/tests
de mon projet, alors que les modules que je suis en essais sont enfoo/src
. Pour exécuter les tests defoo/tests
sans erreurs d'import-je créer un fichierfoo/tests/pathmagic.py
qui ressemble à ceci;Dans chaque fichier de test, j'utilise ensuite
comme la première importation. Le "noqa" commentaire empêche
pycodestyle
/pep8
de se plaindre d'un solde non utilisé de l'importation.Si il y a juste quelques importations, vous pouvez simplement ignorer PEP8 sur ces
import
lignes:# noqa: E402
par exemple. (source)Il y a une autre solution.
try
corps et tout le reste (qui ne dépend pas d'elle) ci-dessus.J'ai juste eu du mal avec une question similaire, et je crois que j'ai trouvé un peu plus agréable à la solution que l'on a accepté la réponse.
Créer un
pathmagic
module qui fait tout le sys.chemin de la manipulation, mais de faire le changement au sein d'un gestionnaire de contexte:Ensuite, dans vos fichiers de test (ou partout où vous avez besoin de cela), vous n':
De cette façon, vous n'obtenez pas de plaintes de flake8/pycodestyle, vous n'avez pas besoin de commentaire particulier, et la structure semble avoir du sens.
Pour plus de propreté, d'envisager effectivement revenir le chemin d'accès dans la
__exit__
bloc, mais cela peut causer des problèmes avec lazy importations (si vous installez le module de code en dehors du contexte), alors peut-être n'en vaut pas la peine.MODIFIER: Juste vu un beaucoup plus simple astuce, un réponse à une autre question: ajouter
assert pathmagic
sous votre importations pour éviter lanoqa
commentaire.__exit__
bloc, pour vraiment le faire correctement aurait besoin de retirer l'ajout du chemin d'accès (si ça existe toujours) parce que la restauration de l'ensemble de la valeur précédente de ce qu'il était lorsque le contexte était entré serait également annuler toutes les autres modifications qui pourraient avoir été apportées par d'autres (code exécuté dans le même contexte) pour quelque raison.pathmagic.context()
peut être appelé un nombre arbitraire de fois (par exemple, si l'exécution de tous les tests). Le retour est problématique, trop: à l'importation, à un moment ultérieur (par exemple, faite à la demande) peut échouer.Avez-vous déjà essayer ce qui suit:
Pour se conformer à la pep8, vous devez inclure votre projet chemin vers le python path afin d'effectuer relatif /absolu des importations.
Pour ce faire, vous pouvez jeter un oeil à cette réponse: En permanence à ajouter un répertoire de PYTHONPATH