Structurer les imports

Développer des packages Python

James Fulton

Climate informatics researcher

Sans imports de package

import mysklearn
help(mysklearn.preprocessing)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'mysklearn' has no 
  attribute 'preprocessing'

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Sans imports de package

import mysklearn.preprocessing
help(mysklearn.preprocessing)
Help on package mysklearn.preprocessing in 
mysklearn:

NAME
    mysklearn.preprocessing - A subpackage 
      for standard preprocessing operations.

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Sans imports de package

import mysklearn.preprocessing
help(mysklearn.preprocessing.normalize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 
  'mysklearn.preprocessing' has no attribute
  'normalize'

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Sans imports de package

import mysklearn.preprocessing.normalize
help(mysklearn.preprocessing.normalize)
Help on module mysklearn.preprocessing.normalize
in mysklearn.preprocessing:

NAME
    mysklearn.preprocessing.normalize - A module
      for normalizing data.

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Importer des sous-packages dans des packages

mysklearn/__init__.py

Import absolu

from mysklearn import preprocessing
  • Le plus utilisé – plus explicite

Import relatif

from . import preprocessing
  • Parfois utilisé – plus court et parfois plus simple

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Importer des modules

Nous avons importé preprocessing dans mysklearn

import mysklearn
help(mysklearn.preprocessing)
Help on package mysklearn.preprocessing in 
mysklearn:

NAME
    mysklearn.preprocessing - A subpackage 
      for standard preprocessing operations.

Mais preprocessing n'est pas lié à normalize

import mysklearn
help(mysklearn.preprocessing.normalize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 
  'mysklearn.preprocessing' has no attribute
  'normalize'
Développer des packages Python

Importer des modules

mysklearn/preprocessing/__init__.py

Import absolu

from mysklearn.preprocessing import normalize

Import relatif

from . import normalize

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Restructurer les imports

import mysklearn
help(mysklearn.preprocessing.normalize.normalize_data)
Help on function normalize_data in module
mysklearn.preprocessing.normalize:

normalize_data(x)
    Normalize the data array.
Développer des packages Python

Importer une fonction dans un sous-package

mysklearn/preprocessing/__init__.py

Import absolu

from mysklearn.preprocessing.normalize import \
    normalize_data

Import relatif

from .normalize import normalize_data

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Importer une fonction dans un sous-package

import mysklearn
help(mysklearn.preprocessing.normalize_data)
Help on function normalize_data in module
mysklearn_imp.preprocessing.normalize:

normalize_data(x)
    Normalize the data array.
Développer des packages Python

Importer entre modules frères

Dans normalize.py

Import absolu

from mysklearn.preprocessing.funcs import (
    mymax, mymin
)

Import relatif

from .funcs import mymax, mymin

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Développer des packages Python

Importer entre modules éloignés

Une exception personnalisée MyException est dans utils.py

Dans normalize.py, standardize.py et regression.py

Import absolu

from mysklearn.utils import MyException

Import relatif

from ..utils import MyException

Arborescence d'un package avec des sous-packages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Développer des packages Python

Aide-mémoire des imports relatifs

  • from . import module
    • Depuis le répertoire courant, importer module
  • from .. import module
    • Depuis le répertoire parent, importer module
  • from .module import function
    • Depuis un module du répertoire courant, importer function
  • from ..subpackage.module import function
    • Depuis un sous-package du répertoire parent, dans module de ce sous-package, importer function
Développer des packages Python

Passons à la pratique !

Développer des packages Python

Preparing Video For Download...