2016-01-30 1 views
2

À mesure que mon ordinateur portable s'allonge, je veux extraire du code, afin que le bloc-notes soit plus lisible.Ipython Notebook: Manière élégante d'extraire la méthode?

Par exemple, ceci est une cell/function que je veux extraire de l'ordinateur portable

def R_square_of(MSE, kde_result): 
    # R square measure: 
    # https://en.wikipedia.org/wiki/Coefficient_of_determination 
    y_mean = np.mean(kde_result) 
    SS_tot = np.power(kde_result - y_mean,2) 
    SS_tot_avg = np.average(SS_tot) 

    SS_res_avg = MSE 
    R_square = 1 - SS_res_avg/SS_tot_avg 

    return R_square 

Comment puis-je le faire efficacement?

Mes pensées:

  1. Il est assez facile de créer un my_helper.py et mettre le code ci-dessus là, alors from my_helper import *
  2. Le problème est que, j'utiliser un autre paquet dans la méthode (dans ce cas, np, soit numpy), puis je dois réimporter numpy dans my_helper.py. Peut-il réutiliser l'environnement créé dans ipython notebook, donc pas besoin de réimporter?
  3. Si je change le code dans my_helper.py, j'ai besoin de redémarrer le noyau pour charger le changement (NameError: global name 'numpy' is not defined), cela rend difficile de changer le code dans ce fichier.

Répondre

3

Au lieu d'importer votre autre fichier, vous pouvez l'exécuter à la place avec le %run magic command:

In [1]: %run -i my_helper.py 

-i: exécutez le fichier dans l'espace de noms de IPython au lieu d'un vide. Ceci est utile si vous expérimentez avec du code écrit dans un éditeur de texte qui dépend de variables définies de manière interactive.


Je profite de l'occasion encore de recommander l'écriture du fichier en tant que module python approprié et l'importer. De cette façon, vous développez réellement une base de code utilisable en dehors de l'environnement portable. Vous pouvez écrire des tests pour cela ou le publier quelque part.

+0

Oui, je pense que peut-être un module est meilleur, mais j'ai besoin de redémarrer le noyau pour valider le changement. Est-il possible de se débarrasser de cela? – cqcn1991

+1

La fonction intégrée [reload] (https://docs.python.org/2/library/functions.html#reload) peut vous aider à progresser. – Kos

+0

Trouver ceci, peut-être utile, http://stackoverflow.com/questions/5364050/reloading-submodules-in-ipython – cqcn1991