Sam & Max » init http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Vous pouvez mettre du code dans __init__.py 10 http://sametmax.com/vous-pouvez-mettre-du-code-dans-__init__-py/ http://sametmax.com/vous-pouvez-mettre-du-code-dans-__init__-py/#comments Wed, 26 Jun 2013 11:20:04 +0000 http://sametmax.com/?p=3472 __init__.py ne sert pas qu'à déclarer un dossier comme un package importable. C'est aussi le code exécuté automatiquement, une seule fois, quand on importe le module.]]> Le fichier __init__.py ne sert pas qu’à déclarer un dossier comme un package importable. C’est aussi le code exécuté automatiquement, une seule fois, quand on importe le module.

Du coup vous pouvez mettre dedans tout code Python que vous souhaitez lancer à l’import. On y voit souvent :

  • Initialisation du cache.
  • Constantes comme __version__.
  • Import d’autres modules pour les mettre dans l’espace de nom courant.
  • Check de dépendances.
  • Aliasing.
  • Monkey patching and hacks tout moches qui sont là temporairement pour 6 ans.

Je vous déconseille de mettre trop de code dans le fichier __init__.py, notamment du code métier. C’est une mauvaise habitude que l’on peut voir dans le code de Django par exemple. Car ça veut dire que l’import du package déclenche ce code, qui lui-même importe d’autres modules, qui déclenche d’autres codes, etc. Cela donne des effets de bord à l’import, alors que l’import d’un simple package est quelque chose que l’on veut généralement ne pas avoir beaucoup d’effets.

Dans Django par exemple, c’est ce qui fait que beaucoup de modules lèvent une exception à l’import :

django.core.exceptions.ImproperlyConfigured: Requested setting X but settings are not configured.

Alors qu’ils n’ont pas du tout besoin des settings pour fonctionner.

Si vous avez besoin que votre classe Bidule soit directement importable dans votre package machin, faites dans machin/__init__.py :

from .module_qui_contient_bidule import Bidule

Du coup vous pourrez faire n’importe où ailleurs:

from machin import Bidule

C’est bien plus propre que de mettre tout le code de Bidule dans le __init__.py.

]]>
http://sametmax.com/vous-pouvez-mettre-du-code-dans-__init__-py/feed/ 10