Провідник змінних у блокноті Jupyter


81

Чи є у Jupyter (IPython) дослідник змінних, як у Spyder? Дуже незручно постійно друкувати список змінних кожного разу, коли я проходжу тестовий код.

Ця функція вже впроваджена? Якщо так, то як його ввімкнути?

Відповіді:


93

ОНОВЛЕННЯ

Прокрутіть униз до розділу, позначеного оновленням, для набагато менш заплутаного методу.

СТАРИЙ ВІДПОВІДЬ

Ось зошит про те, як створити власного інспектора змінних . Я думаю, що це було написано ще тоді, коли ноутбук jupyter називали ipython notebook, але він працює на останній версії.

Я розміщу код нижче лише на випадок, якщо посилання порветься.

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_()

Запустити вбудовано з наступним:

inspector = VariableInspectorWindow(get_ipython())
inspector

Зробіть це javascript спливаюче;

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

ОНОВЛЕННЯ

Дата: 17 травня 2017 року

@jfbercher створив інспектор змінних nbextension. Вихідний код можна переглянути тут jupyter_contrib_nbextensions . Для отримання додаткової інформації див. Документи .

Встановити

Користувач

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Віртуальне середовище

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

Увімкнути

jupyter nbextension enable varInspector/main

Ось знімок екрану;

введіть тут опис зображення


1
Чудові речі, було б непогано, якщо б ви опублікували тут знімок того, як це виглядає. Я вірю, що це допомогло б розповсюдити прийняття вас приємного продовження!
Олег

1
@Oleg прямо, я щойно додав. Також я просто хочу бути зрозумілим, що я не писав розширення, написане кимось іншим. Я спробую з’ясувати кого і розмістити атрибуцію пізніше.
Джеймс Дрейпер,

2
Дотримуючись інструкцій після "Оновлення від 17 травня 2017 р.", Ви отримаєте додатковий значок, який схожий на приціл пістолета (- :-) клацніть на ньому, і з’явиться Провідник змінних.
Robino

2
@Robino є трохи кнопки на панелі інструментів праворуч. Це схоже на те, що клацніть по колу, якщо воно є.
James Draper

1
@Robino Це розширення викликає str(eval(obj_name)) , тому, якщо ви використовуєте спеціальний клас, ви можете додати моніторинг властивостей до методу __str__ dunder. Якщо це не так, ви можете обернути змінну другим класом "Моніторинг". Якщо ви хочете конкретики, створіть нове запитання, оскільки тут не вистачає символів для точного коду.
pkowalczyk

30

Це може вам допомогти, хоча це не зовсім те, що пропонує Spyder, і набагато простіше:

Щоб отримати список усіх визначених на даний момент змінних, запустіть хто :

In [1]: foo = 'bar'

In [2]: who
foo

Щоб отримати докладнішу інформацію, запустіть хто :

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

Повний перелік вбудованих функцій див. У розділі Magic Commands


2
те саме, що матлаб / октава: P
Еудженіо Ф. Мартінес Пачеко

29

Якщо ви використовуєте блокноти Jupyter в лабораторії Jupyter , було багато дискусій щодо впровадження дослідника змінних / інспектора. Ви можете слідкувати за цим питанням тут

На сьогоднішній день в роботі працює одне розширення Jupyter Lab, яке реалізує подібний до Spyder дослідник змінних. Він базується на розширенні блокнота, про яке Джеймс згадував у своїй відповіді. Ви можете знайти розширення лабораторії (з інструкціями щодо встановлення) тут: https://github.com/lckr/jupyterlab-variableInspector

введіть тут опис зображення


2
саме те, що я
шукав

2
Якщо ви не впевнені, як встановити розширення в JupyterLab, виконайте такі дії: jupyterlab.readthedocs.io/en/stable/user/extensions.html
Nibood_the_slightly_advanced

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.