Soru Jupyter Not Defteri'nde Değişken Gezgini


Spyder'da olduğu gibi Jupyter'de (IPython) değişken bir explorer var mı? Test kodundan geçtiğimde her zaman değişkenlerin listesini yazdırmak çok rahatsız edici.

Bu özellik henüz uygulandı mı? Varsa, nasıl etkinleştirilir?


25
2018-06-09 06:59


Menşei




Cevaplar:


GÜNCELLEŞTİRME

Çok daha az kıvrık bir yöntem için güncellenmiş etiket bölümüne aşağı doğru ilerleyin.

ESKİ CEVAP

İşte kendinize ait bir defter nasıl Değişken Müfettiş. Jupyter defterine ipython notebook adı verildiğinde yazıldığını düşünüyorum ama en son sürümde çalışıyor.

Bağlantı koptuğunda kodu aşağıya gönderirim.

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

Aşağıdakilerle satır içi çalıştırın:

inspector = VariableInspectorWindow(get_ipython())
inspector

Bir javascript çıkar;

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

GÜNCELLEŞTİRME

Tarih: 17 Mayıs 2017

Birileri bir nbextension değişken müfettişi yazdı. Kaynak kodu burada görülebilir jupyter_contrib_nbextensions.

kurmak

pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user

etkinleştirme

jupyter nbextension enable varInspector/main

İşte bir ekran görüntüsü;

enter image description here


37
2017-12-27 02:13



Harika şeyler, nasıl göründüğüne dair bir anlık görüntü gönderirseniz iyi olur. Güzel uzantının benimsenmesini yaygınlaştırmaya yardımcı olacağına inanıyorum! - Oleg
@Oleg doğru, sadece ekledim. Ayrıca sadece bir başkasının yaptığı uzantıyı yazmadığımı açıklığa kavuşturmak istiyorum. Daha sonra bir kimseyi anlamaya ve bir ilişkilendirme göndermeye çalışacağım. - James Draper
"17 Mayıs 2017'yi Güncelle" ifadesinin ardındaki talimatlar, size bir silah nişanına benzeyen fazladan bir simge verir (- :-) bunun üzerine tıklayın ve Değişken Gezgini açılır. - Robino
@Robino, araç çubuğunda sağa doğru bir düğme gibi görünüyorsa, bir kaç tıklama düğmesi var. - James Draper
@Robino Bu uzantı aramalar  str(eval(obj_name))Bu nedenle, özel sınıf kullanıyorsanız, mülk izleme özelliğini ekleyebilirsiniz. __str__ dunder yöntemi. Değilse, ikinci "İzleme" sınıfı ile değişken sarın. Özellikler istiyorsanız, yeni bir soru oluşturun, çünkü tam kod için burada yeterli karakter kalmadı. - pkowalczyk


Bu size yardımcı olabilir, ancak Spyder'ın sunduğu şey tam olarak bu değildir ve daha basittir:

Halihazırda tanımlanmış tüm değişkenlerin bir listesini almak için kim :

In [1]: foo = 'bar'

In [2]: who
foo

Daha fazla detay için koş kim:

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

Yerleşik işlevlerin tam listesi için bkz. Sihirli Komutlar


16
2018-06-09 07:32