2010-12-08 20 views
3

En utilisant python en mode interactif on importe un module puis si le module est changé (une correction de bogue ou quelque chose du genre) on peut simplement utiliser la commande reload(). Et si je n'ai pas importé le module entier et utilisé l'instruction d'importation 'from M import f, g'. Y at-il un moyen de réimporter seulement g?réimporter une seule fonction en python

(J'ai essayé de supprimer la fonction de la table de paramètres par 'del g' ET de supprimer le fichier .pyc du répertoire.Il n'a pas aidé.Quand j'ai réimporté la fonction 'de M import g' l'ancien g était chargé).

+1

simplement redémarrer l'interpréteur;) – Ant

+0

Franchement, c'est ce que je fais. –

Répondre

9

Lorsque vous effectuez un from foo import bar, vous sont en important le module entier. Vous venez de faire une copie du symbole bar dans l'espace de noms actuel. Vous êtes pas en important simplement la fonction.

La fonction reload n'est pas totalement fiable (par exemple, elle ne fonctionnera pas pour les modules C compilés). Je vous recommande de quitter et de redémarrer votre interprète.

+1

+1 pour indiquer clairement l'importation du module par rapport à l'incorporation du symbole dans l'espace de noms. – pyfunc

+0

Cela ne fonctionne pas de manière simple sur python 2.7.3 - quand je 'foo import ', le symbole' foo' n'est pas défini. Le module a une entrée dans 'sys.modules', donc je peux recharger avec succès (sys.modules ['foo'])' (après 'import sys' bien sûr). – drevicko

0

Pour la première importation, lient la pièce importée à une variable (qui accélère également consultation):

import numpy as NP 
import numpy.linalg as LA 
    ... 
reload(LA) 
1

Depuis c'est juste pour l'interpréteur interactif, je ne pense pas que quelque chose comme :

def my_reload(mod, name): 
    reload(mod) 
    globals()[name] = getattr(mod, name) 

myreload(somemodule, "some_function") 

serait terrible. Cela recharge simplement le module comme d'habitude, puis redéfinit le nom pointant sur l'ancien objet vers le nouvel objet. Cela devrait fonctionner dans tous les cas où reload fonctionnerait pour commencer. Alternativement, vous pouvez le programmer pour prendre l'objet réel et obtenir le nom en utilisant son attribut __name__. Les fonctions, les classes et les modules ont tous un attribut __name__ mais quelque chose comme un dictionnaire au niveau du module ne le fait pas, donc il ne serait pas aussi flexible.

Il ne remplacera pas les références à l'objet existant autre que le global mais pas reload même si vous y avez initialement accédé avec le nom en pointillé. Une fois qu'une référence à un objet est lâche, il n'y a pas grand-chose que vous puissiez faire.