Utilisation de import_module

Besoin d'explications

a marqué ce sujet comme résolu.

Bonjour,

J’étudie actuellement Django en m’appuyant sur l’ouvrage de Patrick SAMSON publié aux éditions ENI sous le titre "Django - Développez vos applications web en Python".

En p. 63, il y a un court exemple reproduit ci-dessous et je ne comprends pas le fonctionnement de la ligne 2. La documentation officielle de Python sur la commande import_module(..,…) provenant d’importlib ne m’a pas été d’une grande utilité vue que le premier argument utilisé ici semble être la source de mon incompréhension.

from importlib import import_module
_module = import_module('.settings_{}'.format(_env), __package__)
for _name in dir(_module):
   if _name[0].isupper():
     locals()[_name] = getattr(_module, _name)

En vous remerciant pour le soin apporté à vos réponses,

Vincent

+0 -0

Salut,

Est-ce que tu est sûr de la syntaxe que tu présentes ? Ça me semple bizarre que ça dise '.settings_()' plutôt que '.settings_{}'. Donc je vais considérer qu’il s’agit d’une erreur de recopie ou d’impression et qu’il s’agit bien d’une paire d’accolades.

Dans le contexte j’imagine qu'_env est une chaîne de caractère qui vaut 'prod' ou 'staging' par exemple. Et donc '.settings_{}'.format(_env) sera évalué en '.settings_prod' sur l’environnement de production.

Dans import_module, ça correspondra donc à importer le module settings_prod du package courant (le préfixe . indique de rechercher dans un package, et celui-ci est fourni en deuxième argument — __package__ — soit le package courant).

juste une question par rapport a ton message @entwanne pourquoi ne pas utiliser __import__ la builtin fonction python ?

NightProg

Pour suivre les recommandations de la documentation :

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)

An implementation of the built-in __import__() function.

Note: Programmatic importing of modules should use import_module() instead of this function.

https://docs.python.org/3/library/importlib.html#importlib.__import__
__import__(name, globals=None, locals=None, fromlist=(), level=0)

Note: C’est une fonction avancée qui n’est pas fréquemment nécessaire, contrairement à importlib.import_module().

https://docs.python.org/fr/3/library/functions.html#import__

Le problème c’est qu'__import__ est l’interface bas-niveau du mécanisme d’import et qu’on n’a pas trop envie d’aller y toucher. On préférera se contenter de l’interface haut-niveau (avec import_module) qui permet de faire les choses plus simplement (notamment la gestion des paquets).


@Vincent Breton Sinon pour plus d’info sur str.format je peux aussi te conseiller la lecture de https://zestedesavoir.com/tutoriels/2514/un-zeste-de-python/6-entrees-sorties/5-fstrings/#1–1-format

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte