callbacks.rst
99 lines
| 3.3 KiB
| text/x-rst
|
RstLexer
Min RK
|
r21899 | .. _events: | ||
.. _callbacks: | ||||
============== | ||||
IPython Events | ||||
============== | ||||
Thomas Kluyver
|
r15604 | |||
Extension code can register callbacks functions which will be called on specific | ||||
events within the IPython code. You can see the current list of available | ||||
callbacks, and the parameters that will be passed with each, in the callback | ||||
Jeremy Sikes
|
r24029 | prototype functions defined in :mod:`IPython.core.events`. | ||
Thomas Kluyver
|
r15604 | |||
Thomas Kluyver
|
r15613 | To register callbacks, use :meth:`IPython.core.events.EventManager.register`. | ||
Thomas Kluyver
|
r15604 | For example:: | ||
class VarWatcher(object): | ||||
def __init__(self, ip): | ||||
self.shell = ip | ||||
self.last_x = None | ||||
Fabio Niephaus
|
r23997 | def pre_execute(self): | ||
Thomas Kluyver
|
r15604 | self.last_x = self.shell.user_ns.get('x', None) | ||
Fabio Niephaus
|
r23997 | def pre_run_cell(self, info): | ||
print('Cell code: "%s"' % info.raw_cell) | ||||
def post_execute(self): | ||||
Thomas Kluyver
|
r15604 | if self.shell.user_ns.get('x', None) != self.last_x: | ||
print("x changed!") | ||||
Fabio Niephaus
|
r23909 | |||
Fabio Niephaus
|
r23997 | def post_run_cell(self, result): | ||
print('Cell code: "%s"' % result.info.raw_cell) | ||||
if result.error_before_exec: | ||||
print('Error before execution: %s' % result.error_before_exec) | ||||
Thomas Kluyver
|
r15604 | def load_ipython_extension(ip): | ||
vw = VarWatcher(ip) | ||||
Thomas Kluyver
|
r15613 | ip.events.register('pre_execute', vw.pre_execute) | ||
Fabio Niephaus
|
r23997 | ip.events.register('pre_run_cell', vw.pre_run_cell) | ||
Thomas Kluyver
|
r15613 | ip.events.register('post_execute', vw.post_execute) | ||
Fabio Niephaus
|
r23997 | ip.events.register('post_run_cell', vw.post_run_cell) | ||
Thomas Kluyver
|
r15604 | |||
Thomas Kluyver
|
r15606 | |||
Min RK
|
r21899 | Events | ||
====== | ||||
These are the events IPython will emit. Callbacks will be passed no arguments, unless otherwise specified. | ||||
shell_initialized | ||||
----------------- | ||||
.. code-block:: python | ||||
def shell_initialized(ipython): | ||||
... | ||||
This event is triggered only once, at the end of setting up IPython. | ||||
Extensions registered to load by default as part of configuration can use this to execute code to finalize setup. | ||||
Callbacks will be passed the InteractiveShell instance. | ||||
pre_run_cell | ||||
------------ | ||||
``pre_run_cell`` fires prior to interactive execution (e.g. a cell in a notebook). | ||||
It can be used to note the state prior to execution, and keep track of changes. | ||||
Fabio Niephaus
|
r23997 | An object containing information used for the code execution is provided as an argument. | ||
Min RK
|
r21899 | |||
pre_execute | ||||
----------- | ||||
``pre_execute`` is like ``pre_run_cell``, but is triggered prior to *any* execution. | ||||
Sometimes code can be executed by libraries, etc. which | ||||
skipping the history/display mechanisms, in which cases ``pre_run_cell`` will not fire. | ||||
post_run_cell | ||||
------------- | ||||
Fabio Niephaus
|
r23984 | ``post_run_cell`` runs after interactive execution (e.g. a cell in a notebook). | ||
It can be used to cleanup or notify or perform operations on any side effects produced during execution. | ||||
For instance, the inline matplotlib backend uses this event to display any figures created but not explicitly displayed during the course of the cell. | ||||
Fabio Niephaus
|
r23982 | The object which will be returned as the execution result is provided as an | ||
argument. | ||||
Min RK
|
r21899 | |||
post_execute | ||||
------------ | ||||
The same as ``pre_execute``, ``post_execute`` is like ``post_run_cell``, | ||||
Fabio Niephaus
|
r23982 | but fires for *all* executions, not just interactive ones. | ||
Fabio Niephaus
|
r23909 | |||
Thomas Kluyver
|
r15606 | |||
Thomas Kluyver
|
r15604 | .. seealso:: | ||
Module :mod:`IPython.core.hooks` | ||||
The older 'hooks' system allows end users to customise some parts of | ||||
IPython's behaviour. | ||||
:doc:`inputtransforms` | ||||
By registering input transformers that don't change code, you can monitor | ||||
what is being executed. | ||||