J'ai récemment mis à niveau les versions de pylint , un vérificateur de style Python populaire.
Il est devenu balistique dans tout mon code, en indiquant les endroits où j'importe des modules dans le même package, sans spécifier le chemin d'accès complet du package.
Le nouveau message d'erreur est W0403.
W0403: Importation relative% r, devrait être% r
Utilisé quand une importation relative au répertoire du paquet est détectée.
Exemple
Par exemple, si mes paquets sont structurés comme ceci:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
et dans le paquet d'éponge j'écris:
import icing
au lieu de
import cake.icing
Je vais avoir cette erreur.
Bien que je comprenne que tous les messages Pylint n’ont pas la même importance et que je n’ai pas peur de les rejeter, je ne comprends pas pourquoi une telle pratique est considérée comme une mauvaise idée.
J'espérais que quelqu'un pourrait expliquer les pièges afin de pouvoir améliorer mon style de codage plutôt que (comme je le fais actuellement) de désactiver cet avertissement apparemment faux.
la source
import .icing
au lieu defrom . import icing
from <> import
;import <>
est toujours absolu. Bien sûr, les importations absolues peuvent utiliserfrom <> import
en omettant les points principaux. La raison pour laquelle ilimport .foo
est interdit est parce que , après ,import XXX.YYY.ZZZ
puisXXX.YYY.ZZZ
est utilisable dans une expression. Mais.moduleY
n'est pas utilisable dans une expression.Il y a quelques bonnes raisons:
Les importations relatives se cassent facilement lorsque vous déplacez un module.
Imaginez que vous ayez un
foo.bar
, unfoo.baz
et unbaz
module dans votre paquet.foo.bar
importationsfoo.baz
, mais en utilisant une importation relative.Maintenant, si vous deviez vous déplacer
foo.bar
versbar
, votre module en importe soudainement un autrebaz
!Les importations relatives sont ambiguës. Même sans déplacer le
bar
module dans l'exemple ci-dessus, un nouveau développeur venant dans votre projet pourrait être pardonné de ne pas se rendre compte que c'étaitbaz
vraimentfoo.baz
au lieu dubaz
package de niveau racine .Les importations absolues rendent explicite le module utilisé. Et comme
import this
prêche, explicite vaut mieux qu'implicite.Python 3 a totalement désactivé les importations relatives implicites; les importations sont désormais toujours interprétées comme absolues, ce qui signifie que, dans l'exemple ci-dessus
import baz
, importera toujours le module de niveau supérieur. Vous devrez utiliser la syntaxe d'importation explicite à la place (from . import baz
).Porter l'exemple de Python 2 à 3 entraînerait donc des problèmes inattendus. Utiliser maintenant les importations absolues rendra votre code à l'épreuve du temps.
la source