web-dev-qa-db-fra.com

Comment recharger un module python importé en utilisant `from module import *`

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? :)

39
murftown

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
43
Catskul

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.

8
Allen

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.

3
tzot

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
1
Eric O Lebigot

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
0
Ohad Cohen

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)
0
Veniamin Magnet