web-dev-qa-db-fra.com

Variable Explorer dans le cahier Jupyter

Existe-t-il une variable Explorer dans Jupyter (IPython) comme dans Spyder? Il est très inconfortable d’avoir à tout moment la liste des variables à imprimer chaque fois que je vérifie le code de test.

Cette fonctionnalité a-t-elle déjà été implémentée? Si oui, comment l'activer?

57
Ébe Isaac

MISE À JOUR

Faites défiler jusqu'à la section intitulée mise à jour pour une méthode beaucoup moins compliquée.

ANCIENNE REPONSE

Voici un cahier sur la création de votre propre Inspecteur de variables . Je pense que cela a été écrit lorsque jupyter notebook était appelé ipython notebook, mais cela fonctionne avec la dernière version.

Je posterai le code ci-dessous juste au cas où le lien se briserait.

import ipywidgets as widgets # Loads the Widget framework.
from IPython.core.magics.namespace import NamespaceMagics # Used to query namespace.

# For this example, hide these names, just to avoid polluting the namespace further
get_ipython().user_ns_hidden['widgets'] = widgets
get_ipython().user_ns_hidden['NamespaceMagics'] = NamespaceMagics

class VariableInspectorWindow(object):
    instance = None

def __init__(self, ipython):
    """Public constructor."""
    if VariableInspectorWindow.instance is not None:
        raise Exception("""Only one instance of the Variable Inspector can exist at a 
            time.  Call close() on the active instance before creating a new instance.
            If you have lost the handle to the active instance, you can re-obtain it
            via `VariableInspectorWindow.instance`.""")

    VariableInspectorWindow.instance = self
    self.closed = False
    self.namespace = NamespaceMagics()
    self.namespace.Shell = ipython.kernel.Shell

    self._box = widgets.Box()
    self._box._dom_classes = ['inspector']
    self._box.background_color = '#fff'
    self._box.border_color = '#ccc'
    self._box.border_width = 1
    self._box.border_radius = 5

    self._modal_body = widgets.VBox()
    self._modal_body.overflow_y = 'scroll'

    self._modal_body_label = widgets.HTML(value = 'Not hooked')
    self._modal_body.children = [self._modal_body_label]

    self._box.children = [
        self._modal_body, 
    ]

    self._ipython = ipython
    self._ipython.events.register('post_run_cell', self._fill)

def close(self):
    """Close and remove hooks."""
    if not self.closed:
        self._ipython.events.unregister('post_run_cell', self._fill)
        self._box.close()
        self.closed = True
        VariableInspectorWindow.instance = None

def _fill(self):
    """Fill self with variable information."""
    values = self.namespace.who_ls()
    self._modal_body_label.value = '<table class="table table-bordered table-striped"><tr><th>Name</th><th>Type</th><th>Value</th></tr><tr><td>' + \
        '</td></tr><tr><td>'.join(['{0}</td><td>{1}</td><td>{2}'.format(v, type(eval(v)).__name__, str(eval(v))) for v in values]) + \
        '</td></tr></table>'

def _ipython_display_(self):
    """Called when display() or pyout is used to display the Variable 
    Inspector."""
    self._box._ipython_display_()

Exécuter en ligne avec les éléments suivants:

inspector = VariableInspectorWindow(get_ipython())
inspector

Faites-en un javascript pop out;

%%javascript
$('div.inspector')
    .detach()
    .prependTo($('body'))
    .css({
        'z-index': 999, 
        position: 'fixed',
        'box-shadow': '5px 5px 12px -3px black',
        opacity: 0.9
    })
    .draggable();

MISE À JOUR

Date: 17 mai 2017

@ jfbercher a créé un inspecteur de variable nbextension. Le code source peut être vu ici jupyter_contrib_nbextensions . Pour plus d'informations, voir docs .

Installer

Utilisateur

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Environnement virtuel

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --sys-prefix

Activer

jupyter nbextension enable varInspector/main

Voici une capture d'écran;

enter image description here

71
James Draper

Cela pourrait vous aider, même si ce n’est pas exactement ce que propose Spyder, c’est beaucoup plus simple:

Pour obtenir la liste de toutes les variables actuellement définies, exécutez qui :

In [1]: foo = 'bar'

In [2]: who
foo

Pour plus de détails, lancez whos :

In [3]: whos
Variable   Type    Data/Info
----------------------------
foo        str     bar

Pour une liste complète des fonctions intégrées, voir Commandes magiques

24
Amin Alaee

Si vous utilisez des cahiers Jupyter dans Jupyter Lab , de nombreuses discussions ont eu lieu sur la mise en œuvre d'un explorateur/inspecteur de variable. Vous pouvez suivre le problème ici

À l'heure actuelle, il existe une extension Jupyter Lab implémentant un explorateur de variables de type Spyder. Il est basé sur l'extension de cahier mentionnée par James dans sa réponse. Vous pouvez trouver l'extension de laboratoire (avec les instructions d'installation) ici: https://github.com/lckr/jupyterlab-variableInspector

enter image description here

17
Simon