Simplified variable inspector example

Jonathan Frederic 12 years ago
parent c807dd29e4
commit ce461ec20a

@ -12,235 +12,556 @@
"level": 1,
"metadata": {},
"source": [
"Build the Variable Inspector"
"Variable Inspector Widget"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from IPython.html import widgets\n",
"from IPython.display import display\n",
"import re"
],
"language": "python",
"cell_type": "heading",
"level": 2,
"metadata": {},
"outputs": [],
"prompt_number": 1
"source": [
"A short example implementation."
]
},
{
"cell_type": "heading",
"level": 3,
"cell_type": "markdown",
"metadata": {},
"source": [
"Create Variable Inspector Controls"
"This notebook demonstrates how one can use the widgets already built-in to IPython to create a working variable inspector much like the ones seen in popular commercial scientific computing environments."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"_popout = widgets.ContainerWidget(default_view_name=\"ModalView\")\n",
"_popout.description = \"Variable Inspector\"\n",
"_popout.button_text = _popout.description\n",
"_popout.vbox()\n",
"class VariableInspectorWindow(object):\n",
" \n",
" # For this example file, the import sit inside the class, just to avoid poluting \n",
" # the namespace further.\n",
" from IPython.html import widgets # Loads the Widget framework.\n",
" from IPython.core.magics.namespace import NamespaceMagics # Used to query namespace.\n",
" \n",
" instance = None\n",
" \n",
" def __init__(self, ipython):\n",
" \"\"\"Public constructor.\"\"\"\n",
" if VariableInspectorWindow.instance is not None:\n",
" raise Exception(\"\"\"Only one instance of the Variable Inspector can exist at a \n",
" time. Call close() on the active instance before creating a new instance.\n",
" If you have lost the handle to the active instance, you can re-obtain it\n",
" via `VariableInspectorWindow.instance`.\"\"\")\n",
" \n",
" VariableInspectorWindow.instance = self\n",
" self.closed = False\n",
" self.namespace = self.NamespaceMagics()\n",
" self.namespace.shell = ipython.kernel.shell\n",
" \n",
" self._popout = self.widgets.PopupWidget()\n",
" self._popout.description = \"Variable Inspector\"\n",
" self._popout.button_text = self._popout.description\n",
"\n",
"_modal_header_execs_label = widgets.StringWidget(parent=_popout, default_view_name=\"HTMLView\")\n",
"_modal_header_execs_label.execs = 0\n",
" self._modal_body = self.widgets.ContainerWidget()\n",
" self._modal_body.set_css('overflow-y', 'scroll')\n",
"\n",
"_modal_body = widgets.ContainerWidget(parent=_popout)\n",
"_modal_body.flex1()\n",
"_modal_body.set_css('overflow-y', 'scroll')\n",
"_modal_body_label = widgets.StringWidget(parent=_modal_body, default_view_name=\"HTMLView\")\n",
"_modal_body_label.value = 'Not hooked'\n",
" self._modal_body_label = self.widgets.HTMLWidget(value = 'Not hooked')\n",
" self._modal_body.children = [self._modal_body_label]\n",
"\n",
"_modal_footer = widgets.ContainerWidget(parent=_popout)\n",
"_var_filter = widgets.SelectionWidget(values=['Public', 'Private', 'IPython'], parent=_modal_footer, value='Public', default_view_name='ToggleButtonsView')\n",
" self._modal_footer = self.widgets.ContainerWidget()\n",
" self._var_filter = self.widgets.ToggleButtonsWidget(description=\"Method:\", values=['List', 'Details'], value='List')\n",
" self._modal_footer.children = [self._var_filter]\n",
"\n",
"display(_popout)\n",
" self._popout.children = [\n",
" self._modal_body, \n",
" self._modal_footer,\n",
" ]\n",
" \n",
" self._ipython = ipython\n",
" self._ipython.register_post_execute(self._fill)\n",
" self._var_filter.on_trait_change(self._fill, 'value')\n",
"\n",
" def close(self):\n",
" \"\"\"Close and remove hooks.\"\"\"\n",
" if not self.closed:\n",
" del self._ipython._post_execute[self._fill]\n",
" self._popout.close()\n",
" self.closed = True\n",
" VariableInspectorWindow.instance = None\n",
"\n",
" def _fill(self):\n",
" \"\"\"Fill self with variable information.\"\"\"\n",
" values = self.namespace.who_ls()\n",
" mode = self._var_filter.value\n",
" if mode == \"List\":\n",
" self._modal_body_label.value = '<br>'.join(values)\n",
" elif mode == \"Details\":\n",
" 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>' + \\\n",
" '</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]) + \\\n",
" '</td></tr></table>'\n",
"\n",
"_modal_footer.add_class('modal-footer')\n"
" def _ipython_display_(self):\n",
" \"\"\"Called when display() or pyout is used to display the Variable \n",
" Inspector.\"\"\"\n",
" self._popout._ipython_display_()\n",
" self._modal_footer.add_class('modal-footer')\n",
" self._popout.add_class('vbox')\n",
" self._modal_body.add_class('box-flex1')\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Method that Fills the Inspector"
]
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"_ipython_input = re.compile('_i[0-9]*')\n",
"\n",
"def _fill_inspector():\n",
" \n",
" # Apply filter to variable names.\n",
" names = []\n",
" for name in sorted(_ipython.user_ns):\n",
" \n",
" match = _ipython_input.match(name)\n",
" is_ipython = (match is not None and match.group() == name) or \\\n",
" name == '_dh' or \\\n",
" name == '_ih' or \\\n",
" name == '_ii' or \\\n",
" name == '_iii' or \\\n",
" name == '_oh' or \\\n",
" name == '_sh' or \\\n",
" name == 'get_ipython' or \\\n",
" name == 'In' or \\\n",
" name == 'Out' or \\\n",
" name == 'exit' or \\\n",
" name == 'help' or \\\n",
" name == 'quit' or \\\n",
" name == '_' or \\\n",
" name == '__' or \\\n",
" name == '___'\n",
" \n",
" is_private = name.startswith('_')\n",
" is_public = not is_private\n",
" \n",
" var_filter = _var_filter.value\n",
" if var_filter == 'IPython' and is_ipython:\n",
" names.append(name)\n",
" elif var_filter == 'Private' and (is_private and not is_ipython):\n",
" names.append(name)\n",
" elif var_filter == 'Public' and (is_public and not is_ipython):\n",
" names.append(name)\n",
" \n",
" # Render each name and it's value.\n",
" variable_list_html = \"\"\"\n",
"<table class=\"table table-bordered table-striped\" style=\"width: 100%; overflow: hidden; table-layout:fixed;\">\n",
" <tr><th>Name</th><th>Type</th><th>Value</th>\"\"\"\n",
" for name in names:\n",
" var_value = _ipython.user_ns[name]\n",
" var_type = type(var_value)\n",
" var_small_value = str(var_value)[:100].replace(\"&\", \"&amp;\").replace(\"<\", \"&lt;\")\n",
" \n",
" if str(var_value) != var_small_value:\n",
" var_small_value += '<br><div class=\"label label-info\">...</div>'\n",
" \n",
" row = \"\"\"\n",
"<tr style='overflow: hidden;'>\n",
" <td style='width: 30%; overflow: hidden;'>{name}</td>\n",
" <td style='width: 30%; overflow: hidden;'>{type}</td>\n",
" <td style='width: 40%; overflow: hidden;'>{small_value}</td>\n",
"</tr>\n",
"\"\"\".format(name=name, type=var_type.__name__, small_value=var_small_value, value=str(var_value))\n",
" variable_list_html += row + '\\n'\n",
" variable_list_html += '</table>'\n",
" _modal_body_label.value = variable_list_html\n",
" \n",
" "
"inspector = VariableInspectorWindow(get_ipython())\n",
"inspector"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
"prompt_number": 18
},
{
"cell_type": "heading",
"level": 3,
"level": 1,
"metadata": {},
"source": [
"Hook Cell Execute and Filter Change"
"Test"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"_ipython = get_ipython()\n",
"\n",
"try:\n",
" del _ipython._post_execute[handle_cell_executed]\n",
"except:\n",
" pass\n",
"\n",
"def _handle_cell_executed():\n",
" _modal_header_execs_label.execs += 1\n",
" _modal_header_execs_label.value = '%d cell executions captured' % _modal_header_execs_label.execs\n",
" _fill_inspector()\n",
"_ipython.register_post_execute(_handle_cell_executed)\n",
"\n",
"def _handle_filter_changed():\n",
" _fill_inspector()\n",
"_var_filter.on_trait_change(_handle_filter_changed, 'value')"
"a = 5"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
"prompt_number": 11
},
{
"cell_type": "heading",
"level": 1,
"cell_type": "code",
"collapsed": false,
"input": [
"b = 3.0"
],
"language": "python",
"metadata": {},
"source": [
"Test"
]
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = 5"
"c = a * b"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"b = 3.0"
"d = \"String\""
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"c = a * b"
"del b"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"d = \"String\""
"?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"del b"
"dir()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": [
"['In',\n",
" 'Out',\n",
" 'VariableInspectorWindow',\n",
" '_',\n",
" '_10',\n",
" '_14',\n",
" '__',\n",
" '___',\n",
" '__builtin__',\n",
" '__builtins__',\n",
" '__doc__',\n",
" '__name__',\n",
" '__package__',\n",
" '_dh',\n",
" '_i',\n",
" '_i1',\n",
" '_i10',\n",
" '_i11',\n",
" '_i12',\n",
" '_i13',\n",
" '_i14',\n",
" '_i15',\n",
" '_i2',\n",
" '_i3',\n",
" '_i4',\n",
" '_i5',\n",
" '_i6',\n",
" '_i7',\n",
" '_i8',\n",
" '_i9',\n",
" '_ih',\n",
" '_ii',\n",
" '_iii',\n",
" '_oh',\n",
" '_sh',\n",
" 'exit',\n",
" 'get_ipython',\n",
" 'quit',\n",
" 'widgets']"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dir(get_ipython().kernel.shell)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"['Completer',\n",
" 'CustomTB',\n",
" 'InteractiveTB',\n",
" 'SyntaxTB',\n",
" '__class__',\n",
" '__delattr__',\n",
" '__dict__',\n",
" '__doc__',\n",
" '__format__',\n",
" '__getattribute__',\n",
" '__hash__',\n",
" '__init__',\n",
" '__module__',\n",
" '__new__',\n",
" '__reduce__',\n",
" '__reduce_ex__',\n",
" '__repr__',\n",
" '__setattr__',\n",
" '__sizeof__',\n",
" '__str__',\n",
" '__subclasshook__',\n",
" '__weakref__',\n",
" '_add_notifiers',\n",
" '_call_pdb',\n",
" '_config_changed',\n",
" '_exit_now_changed',\n",
" '_exiter_default',\n",
" '_find_my_config',\n",
" '_format_user_obj',\n",
" '_get_call_pdb',\n",
" '_get_exc_info',\n",
" '_indent_current_str',\n",
" '_inspect',\n",
" '_instance',\n",
" '_ipython_dir_changed',\n",
" '_last_input_line',\n",
" '_load_config',\n",
" '_main_mod_cache',\n",
" '_notify_trait',\n",
" '_object_find',\n",
" '_ofind',\n",
" '_ofind_property',\n",
" '_orig_sys_module_state',\n",
" '_orig_sys_modules_main_mod',\n",
" '_orig_sys_modules_main_name',\n",
" '_post_execute',\n",
" '_prompt_in1_changed',\n",
" '_prompt_in2_changed',\n",
" '_prompt_out_changed',\n",
" '_prompt_pad_left_changed',\n",
" '_prompt_trait_changed',\n",
" '_remove_notifiers',\n",
" '_reply_content',\n",
" '_run_cached_cell_magic',\n",
" '_set_call_pdb',\n",
" '_showtraceback',\n",
" '_trait_dyn_inits',\n",
" '_trait_notifiers',\n",
" '_trait_values',\n",
" '_user_obj_error',\n",
" '_walk_mro',\n",
" 'alias_manager',\n",
" 'all_ns_refs',\n",
" 'ask_exit',\n",
" 'ask_yes_no',\n",
" 'ast_node_interactivity',\n",
" 'ast_transformers',\n",
" 'atexit_operations',\n",
" 'auto_rewrite_input',\n",
" 'autocall',\n",
" 'autoindent',\n",
" 'automagic',\n",
" 'builtin_trap',\n",
" 'cache_size',\n",
" 'call_pdb',\n",
" 'class_config_section',\n",
" 'class_get_help',\n",
" 'class_get_trait_help',\n",
" 'class_print_help',\n",
" 'class_trait_names',\n",
" 'class_traits',\n",
" 'cleanup',\n",
" 'clear_instance',\n",
" 'clear_main_mod_cache',\n",
" 'color_info',\n",
" 'colors',\n",
" 'colors_force',\n",
" 'comm_manager',\n",
" 'compile',\n",
" 'complete',\n",
" 'config',\n",
" 'configurables',\n",
" 'custom_exceptions',\n",
" 'data_pub',\n",
" 'data_pub_class',\n",
" 'db',\n",
" 'debug',\n",
" 'debugger',\n",
" 'deep_reload',\n",
" 'default_user_namespaces',\n",
" 'define_macro',\n",
" 'define_magic',\n",
" 'del_var',\n",
" 'dir_stack',\n",
" 'disable_failing_post_execute',\n",
" 'display_formatter',\n",
" 'display_pub',\n",
" 'display_pub_class',\n",
" 'display_trap',\n",
" 'displayhook',\n",
" 'displayhook_class',\n",
" 'drop_by_id',\n",
" 'enable_gui',\n",
" 'enable_matplotlib',\n",
" 'enable_pylab',\n",
" 'ev',\n",
" 'ex',\n",
" 'excepthook',\n",
" 'execution_count',\n",
" 'exit_now',\n",
" 'exiter',\n",
" 'extension_manager',\n",
" 'extract_input_lines',\n",
" 'filename',\n",
" 'find_cell_magic',\n",
" 'find_line_magic',\n",
" 'find_magic',\n",
" 'find_user_code',\n",
" 'get_ipython',\n",
" 'get_parent',\n",
" 'getoutput',\n",
" 'has_readline',\n",
" 'history_length',\n",
" 'history_manager',\n",
" 'home_dir',\n",
" 'hooks',\n",
" 'indent_current_nsp',\n",
" 'init_alias',\n",
" 'init_builtins',\n",
" 'init_comms',\n",
" 'init_completer',\n",
" 'init_create_namespaces',\n",
" 'init_data_pub',\n",
" 'init_display_formatter',\n",
" 'init_display_pub',\n",
" 'init_displayhook',\n",
" 'init_encoding',\n",
" 'init_environment',\n",
" 'init_extension_manager',\n",
" 'init_history',\n",
" 'init_hooks',\n",
" 'init_inspector',\n",
" 'init_instance_attrs',\n",
" 'init_io',\n",
" 'init_ipython_dir',\n",
" 'init_latextool',\n",
" 'init_logger',\n",
" 'init_logstart',\n",
" 'init_magics',\n",
" 'init_payload',\n",
" 'init_pdb',\n",
" 'init_prefilter',\n",
" 'init_profile_dir',\n",
" 'init_prompts',\n",
" 'init_pushd_popd_magic',\n",
" 'init_readline',\n",
" 'init_syntax_highlighting',\n",
" 'init_sys_modules',\n",
" 'init_traceback_handlers',\n",
" 'init_user_ns',\n",
" 'init_virtualenv',\n",
" 'initialized',\n",
" 'input_splitter',\n",
" 'input_transformer_manager',\n",
" 'inspector',\n",
" 'instance',\n",
" 'ipython_dir',\n",
" 'keepkernel_on_exit',\n",
" 'kernel',\n",
" 'logappend',\n",
" 'logfile',\n",
" 'logger',\n",
" 'logstart',\n",
" 'magic',\n",
" 'magics_manager',\n",
" 'meta',\n",
" 'mktempfile',\n",
" 'more',\n",
" 'multiline_history',\n",
" 'new_main_mod',\n",
" 'ns_table',\n",
" 'object_info_string_level',\n",
" 'object_inspect',\n",
" 'on_trait_change',\n",
" 'parent',\n",
" 'parent_header',\n",
" 'payload_manager',\n",
" 'pdb',\n",
" 'pre_readline',\n",
" 'prefilter',\n",
" 'prefilter_manager',\n",
" 'prepare_user_module',\n",
" 'profile',\n",
" 'profile_dir',\n",
" 'prompt_in1',\n",
" 'prompt_in2',\n",
" 'prompt_manager',\n",
" 'prompt_out',\n",
" 'prompts_pad_left',\n",
" 'push',\n",
" 'pycolorize',\n",
" 'pylab_gui_select',\n",
" 'quiet',\n",
" 'raw_input_original',\n",
" 'readline',\n",
" 'readline_delims',\n",
" 'readline_no_record',\n",
" 'readline_parse_and_bind',\n",
" 'readline_remove_delims',\n",
" 'readline_use',\n",
" 'refill_readline_hist',\n",
" 'register_magic_function',\n",
" 'register_magics',\n",
" 'register_post_execute',\n",
" 'reset',\n",
" 'reset_selective',\n",
" 'restore_sys_module_state',\n",
" 'rl_do_indent',\n",
" 'rl_next_input',\n",
" 'run_ast_nodes',\n",
" 'run_cell',\n",
" 'run_cell_magic',\n",
" 'run_code',\n",
" 'run_line_magic',\n",
" 'runcode',\n",
" 'safe_execfile',\n",
" 'safe_execfile_ipy',\n",
" 'safe_run_module',\n",
" 'save_sys_module_state',\n",
" 'section_names',\n",
" 'separate_in',\n",
" 'separate_out',\n",
" 'separate_out2',\n",
" 'set_autoindent',\n",
" 'set_completer_frame',\n",
" 'set_custom_completer',\n",
" 'set_custom_exc',\n",
" 'set_hook',\n",
" 'set_next_input',\n",
" 'set_parent',\n",
" 'set_readline_completer',\n",
" 'show_rewritten_input',\n",
" 'show_usage',\n",
" 'show_usage_error',\n",
" 'showindentationerror',\n",
" 'showsyntaxerror',\n",
" 'showtraceback',\n",
" 'starting_dir',\n",
" 'stdin_encoding',\n",
" 'strdispatchers',\n",
" 'sys_excepthook',\n",
" 'system',\n",
" 'system_piped',\n",
" 'system_raw',\n",
" 'tempfiles',\n",
" 'trait_metadata',\n",
" 'trait_names',\n",
" 'traits',\n",
" 'transform_ast',\n",
" 'update_config',\n",
" 'user_expressions',\n",
" 'user_global_ns',\n",
" 'user_module',\n",
" 'user_ns',\n",
" 'user_ns_hidden',\n",
" 'user_variables',\n",
" 'var_expand',\n",
" 'wildcards_case_sensitive',\n",
" 'write',\n",
" 'write_err',\n",
" 'xmode']"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}

Loading…
Cancel
Save