2010-07-21 15 views
2

que je fais beaucoup de développement dans IPython oùLa meilleure façon de gérer reload-tion des objets, et non des modules

In[3]: from mystuff import MyObject 

puis je fais beaucoup de changements dans mystuff.py. Afin de mettre à jour l'espace de noms, je dois faire

In[4]: reload(mystuff) 
In[5]: from mystuff import MyObject 

Y at-il une meilleure façon de le faire? Notez que je ne peux pas importer MyObject par mystuff référencement directement avec

In[6]: import mystuff 
In[7]: mystuff.MyObject 

puisque ce n'est pas comment cela fonctionne dans le code. Encore mieux serait d'avoir IPython automatiquement faire cela quand j'écris le fichier (mais c'est probablement une question pour une autre fois).

Toute aide appréciée.

+0

Peut-être que l'extension 'ipy_autoreload' répond à vos questions :) – Wolph

Répondre

3

Vous pouvez utiliser la fonction deep_reload de IPython faire.

http://ipython.scipy.org/doc/manual/html/interactive/reference.html?highlight=dreload

Si vous exécutez ipython avec le paramètre -deep_reload pour remplacer la méthode reload() normale.

Et si cela ne fait pas ce que vous voulez, il serait possible d'écrire un script pour remplacer automatiquement tous les modules importés dans la portée. Assez hacky cependant, mais cela devrait fonctionner;)

Je viens de trouver le module ipy_autoreload. Peut-être que cela peut vous aider un peu. Je ne suis pas encore sûr comment cela fonctionne, mais cela devrait fonctionner selon les docs:

import ipy_autoreload 
%autoreload 1 
+0

' dreload' ne charge que des modules. –

+0

@jleedev: la commande 'autoreload' fait exactement ce dont il a besoin. Mais vous avez raison, 'dreload()' n'est pas suffisant non plus. – Wolph

+0

Cela semble fonctionner! Le seul inconvénient est qu'il semble recharger * chaque * retour de chariot (c'est-à-dire l'instruction de ligne exécutée dans IPython). Sinon, c'est génial! – reckoner

0

Si l'objet est une classe ou une fonction, vous pouvez utiliser l'attribut __module__ pour déterminer quel module reload:

def reload_for(obj): 
    module = reload(__import__(obj.__module__, fromlist=True)) 
    return getattr(module, obj.__name__) 

MyClass = reload_for(MyClass) 
0

Essayez d'utiliser la magie% run pour importer le contenu du fichier que vous modifiez. Lorsque vous l'utilisez pour importer des objets à partir d'un fichier, il met ces objets à jour chaque fois que vous l'exécutez. De cette façon, il n'est pas autoreloading chaque fois que vous retournez la voiture.