Looking for python Answers? Try Ask4KnowledgeBase
Looking for python Keywords? Try Ask4Keywords

Python Language Importations absolues / relatives


Exemple

Dans Python 3, PEP 404 modifie la façon dont les importations fonctionnent à partir de Python 2. Les importations relatives implicites ne sont plus autorisées dans les packages et à from ... import * importations ne sont autorisées que dans le code de niveau module.

Pour obtenir le comportement de Python 3 dans Python 2:

  • la fonctionnalité d' importation absolue peut être activée à from __future__ import absolute_import
  • les importations relatives explicites sont encouragées à la place des importations implicites relatives

Pour plus de clarté, dans Python 2, un module peut importer le contenu d'un autre module situé dans le même répertoire, comme suit:

import foo

Notez que l'emplacement de foo est ambigu à partir de la seule déclaration d'importation. Ce type d'importation implicite relative est donc déconseillé en faveur d' importations relatives explicites , qui ressemblent à ce qui suit:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

Le point . permet une déclaration explicite de l'emplacement du module dans l'arborescence.


Plus sur les importations relatives

Considérons un paquet défini par l'utilisateur appelé shapes . La structure du répertoire est la suivante:

shapes
├── __init__.py
|
├── circle.py
|
├── square.py
|
└── triangle.py

circle.py , square.py et triangle.py importent tous util.py tant que module. Comment vont-ils se référer à un module du même niveau?

 from . import util # use util.PI, util.sq(x), etc

OU

 from .util import * #use PI, sq(x), etc to call functions

Le . est utilisé pour les importations relatives de même niveau.

Considérons maintenant une autre disposition du module de shapes :

shapes
├── __init__.py
|
├── circle
│   ├── __init__.py
│   └── circle.py
|
├── square
│   ├── __init__.py
│   └── square.py
|
├── triangle
│   ├── __init__.py
│   ├── triangle.py
|
└── util.py

Maintenant, comment ces 3 classes se réfèrent-elles à util.py?

 from .. import util # use util.PI, util.sq(x), etc

OU

 from ..util import * # use PI, sq(x), etc to call functions

Le .. est utilisé pour les importations relatives au niveau parent. Ajouter plus . s avec nombre de niveaux entre le parent et l'enfant.