L'importation relative se produit chaque fois que vous importez un package par rapport au script / package actuel.
Prenons par exemple l'arbre suivant:
mypkg
├── base.py
└── derived.py
Maintenant, vous avez derived.py
besoin de quelque chose de base.py
. Dans Python 2, vous pouvez le faire comme ceci (in derived.py
):
from base import BaseThing
Python 3 ne prend plus en charge cela car il n'est pas explicite si vous voulez le "relatif" ou "absolu" base
. En d'autres termes, s'il y avait un package Python nommé base
installé dans le système, vous vous tromperiez.
Au lieu de cela, il vous oblige à utiliser des importations explicites qui spécifient explicitement l'emplacement d'un module sur une base de chemin. Votre derived.py
ressemblerait à:
from .base import BaseThing
Le premier .
indique «importer base
depuis le répertoire du module»; en d'autres termes, .base
correspond à ./base.py
.
De même, il y a un ..
préfixe qui monte dans la hiérarchie des répertoires comme ../
(avec ..mod
mappage vers ../mod.py
), puis ...
qui monte de deux niveaux ( ../../mod.py
) et ainsi de suite.
Veuillez cependant noter que les chemins relatifs listés ci-dessus étaient relatifs au répertoire dans lequel se trouve le module actuel ( derived.py
), et non au répertoire de travail actuel.
@BrenBarn a déjà expliqué le cas de l'importation d'étoiles. Pour être complet, je vais devoir dire la même chose;).
Par exemple, vous devez utiliser quelques math
fonctions mais vous ne les utilisez que dans une seule fonction. Dans Python 2, vous étiez autorisé à être semi-paresseux:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Notez qu'il déclenche déjà un avertissement dans Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
Dans le code Python 2 moderne, vous devriez et dans Python 3, vous devez faire soit:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
ou:
from math import *
def sin_degrees(x):
return sin(degrees(x))
Pour prendre en charge à la fois Python 2 et Python 3, utilisez des importations relatives explicites comme ci-dessous. Ils sont relatifs au module actuel. Ils ont été pris en charge à partir de 2.5 .
la source
import .brother
n'est pas une syntaxe invalide pour python 2 et 3import ..uncle
. Fixé. Oh, à quoi ai-je pensé ... j'ai probablement été distrait par les chevaliers qui disent Ni!Ajout d'un autre cas à la réponse de Michał Górny:
Notez que les importations relatives sont basées sur le nom du module actuel. Puisque le nom du module principal est toujours "
__main__
", les modules destinés à être utilisés comme module principal d'une application Python doivent toujours utiliser des importations absolues.la source