J'ai vu dans cette utile Q & R que l'on peut utiliser reload(whatever_module)
ou, en Python 3, imp.reload(whatever_module)
.
Ma question est la suivante: et si j’avais dit from whatever_module import *
à importer? Ensuite, je n'ai pas de whatever_module
auquel faire référence lorsque j'utilise reload()
. Est-ce que vous allez me crier dessus d'avoir jeté tout un module dans l'espace de noms global? :)
Je suis d'accord avec le "ne fais pas ça en général" consensus, mais ...
La bonne réponse est:
import X
reload(X)
from X import Y # or * for that matter
Ne jamais utiliser import *
; cela détruit la lisibilité.
Sachez également que le rechargement de modules n’est presque jamais utile. Vous ne pouvez pas prédire l'état dans lequel votre programme se retrouvera après le rechargement d'un module, c'est donc un excellent moyen de générer des bogues incompréhensibles et non reproductibles.
UNE
from module import *
prend tous les objets "exportés" de module
et les lie à des noms de niveau module (ou quel que soit votre niveau). Vous pouvez rechargez le module en tant que:
reload(sys.modules['module'])
mais cela ne vous sera d'aucune utilité: les noms de niveaux quels que soient vos portées désignent toujours les anciens objets.
Une réponse plus nette est un mélange de bonne réponse de Catskul et d'utilisation par Ohad Cohen de sys.module
et de la redéfinition directe:
import sys
Y = reload(sys.module["X"]).Y # reload() returns the new module
En fait, faire import X
crée un nouveau symbole (X
) qui pourrait être redéfini dans le code qui suit, ce qui est inutile (alors que sys
est un module commun, cela ne devrait donc pas se produire).
Le point intéressant ici est que from X import Y
n'ajoute pas X
à l'espace de noms, mais ajoute le module X
à la liste des modules connus (sys.modules
), ce qui permet de recharger le module (et d'accéder à son nouveau contenu).
Plus généralement, si plusieurs symboles importés doivent être mis à jour, il est alors plus pratique de les importer comme ceci:
import sys
reload(sys.module["X"]) # No X symbol created!
from X import Y, Z, T
Lors de l'importation à l'aide de from whatever_module import whatever
, whatever
est compté dans le module d'importation. Par conséquent, pour le recharger, vous devez recharger votre module. Mais en rechargeant simplement votre module, vous obtiendrez toujours l’ancienne whatever
- du whatever_module
déjà importé. Vous devez donc recharger (quel que soit le modèle) et recharger votre module:
# reload(whatever_module), if you imported it
reload(sys.modules['whatever_module'])
reload(sys.modules[__name__])
si vous avez utilisé from whatever_module import whatever
, vous pouvez également envisager
whatever=reload(sys.modules['whatever_module']).whatever
ou
whatever=reload(whatever_module).whatever
pour python 3.7:
from importlib import reload #import function "reload"
import YourModule #import your any modules
reload(YourModule) #reload your module
La fonction de rechargement peut être appelée à partir de votre propre fonction
def yourFunc():
reload(YourModule)