##// END OF EJS Templates
Give the example for custom magics in the docs....
Matthias Bussonnier -
Show More
@@ -1,125 +1,135 b''
1 .. _defining_magics:
1 .. _defining_magics:
2
2
3 Defining custom magics
3 Defining custom magics
4 ======================
4 ======================
5
5
6 There are two main ways to define your own magic functions: from standalone
6 There are two main ways to define your own magic functions: from standalone
7 functions and by inheriting from a base class provided by IPython:
7 functions and by inheriting from a base class provided by IPython:
8 :class:`IPython.core.magic.Magics`. Below we show code you can place in a file
8 :class:`IPython.core.magic.Magics`. Below we show code you can place in a file
9 that you load from your configuration, such as any file in the ``startup``
9 that you load from your configuration, such as any file in the ``startup``
10 subdirectory of your default IPython profile.
10 subdirectory of your default IPython profile.
11
11
12 First, let us see the simplest case. The following shows how to create a line
12 First, let us see the simplest case. The following shows how to create a line
13 magic, a cell one and one that works in both modes, using just plain functions:
13 magic, a cell one and one that works in both modes, using just plain functions:
14
14
15 .. sourcecode:: python
15 .. sourcecode:: python
16
16
17 from IPython.core.magic import (register_line_magic, register_cell_magic,
17 from IPython.core.magic import (register_line_magic, register_cell_magic,
18 register_line_cell_magic)
18 register_line_cell_magic)
19
19
20 @register_line_magic
20 @register_line_magic
21 def lmagic(line):
21 def lmagic(line):
22 "my line magic"
22 "my line magic"
23 return line
23 return line
24
24
25 @register_cell_magic
25 @register_cell_magic
26 def cmagic(line, cell):
26 def cmagic(line, cell):
27 "my cell magic"
27 "my cell magic"
28 return line, cell
28 return line, cell
29
29
30 @register_line_cell_magic
30 @register_line_cell_magic
31 def lcmagic(line, cell=None):
31 def lcmagic(line, cell=None):
32 "Magic that works both as %lcmagic and as %%lcmagic"
32 "Magic that works both as %lcmagic and as %%lcmagic"
33 if cell is None:
33 if cell is None:
34 print("Called as line magic")
34 print("Called as line magic")
35 return line
35 return line
36 else:
36 else:
37 print("Called as cell magic")
37 print("Called as cell magic")
38 return line, cell
38 return line, cell
39
39
40 # In an interactive session, we need to delete these to avoid
40 # In an interactive session, we need to delete these to avoid
41 # name conflicts for automagic to work on line magics.
41 # name conflicts for automagic to work on line magics.
42 del lmagic, lcmagic
42 del lmagic, lcmagic
43
43
44
44
45 You can also create magics of all three kinds by inheriting from the
45 You can also create magics of all three kinds by inheriting from the
46 :class:`IPython.core.magic.Magics` class. This lets you create magics that can
46 :class:`IPython.core.magic.Magics` class. This lets you create magics that can
47 potentially hold state in between calls, and that have full access to the main
47 potentially hold state in between calls, and that have full access to the main
48 IPython object:
48 IPython object:
49
49
50 .. sourcecode:: python
50 .. sourcecode:: python
51
51
52 # This code can be put in any Python module, it does not require IPython
52 # This code can be put in any Python module, it does not require IPython
53 # itself to be running already. It only creates the magics subclass but
53 # itself to be running already. It only creates the magics subclass but
54 # doesn't instantiate it yet.
54 # doesn't instantiate it yet.
55 from __future__ import print_function
55 from __future__ import print_function
56 from IPython.core.magic import (Magics, magics_class, line_magic,
56 from IPython.core.magic import (Magics, magics_class, line_magic,
57 cell_magic, line_cell_magic)
57 cell_magic, line_cell_magic)
58
58
59 # The class MUST call this class decorator at creation time
59 # The class MUST call this class decorator at creation time
60 @magics_class
60 @magics_class
61 class MyMagics(Magics):
61 class MyMagics(Magics):
62
62
63 @line_magic
63 @line_magic
64 def lmagic(self, line):
64 def lmagic(self, line):
65 "my line magic"
65 "my line magic"
66 print("Full access to the main IPython object:", self.shell)
66 print("Full access to the main IPython object:", self.shell)
67 print("Variables in the user namespace:", list(self.shell.user_ns.keys()))
67 print("Variables in the user namespace:", list(self.shell.user_ns.keys()))
68 return line
68 return line
69
69
70 @cell_magic
70 @cell_magic
71 def cmagic(self, line, cell):
71 def cmagic(self, line, cell):
72 "my cell magic"
72 "my cell magic"
73 return line, cell
73 return line, cell
74
74
75 @line_cell_magic
75 @line_cell_magic
76 def lcmagic(self, line, cell=None):
76 def lcmagic(self, line, cell=None):
77 "Magic that works both as %lcmagic and as %%lcmagic"
77 "Magic that works both as %lcmagic and as %%lcmagic"
78 if cell is None:
78 if cell is None:
79 print("Called as line magic")
79 print("Called as line magic")
80 return line
80 return line
81 else:
81 else:
82 print("Called as cell magic")
82 print("Called as cell magic")
83 return line, cell
83 return line, cell
84
84
85
85
86 # In order to actually use these magics, you must register them with a
86 # In order to actually use these magics, you must register them with a
87 # running IPython. This code must be placed in a file that is loaded once
87 # running IPython.
88 # IPython is up and running:
88
89 ip = get_ipython()
89 def load_ipython_extension(ipython):
90 # You can register the class itself without instantiating it. IPython will
90 """
91 # call the default constructor on it.
91 Any nodule file that define a function named load_ipython_extension can
92 ip.register_magics(MyMagics)
92 be loaded via `load_ext` or be configured to be autoloaded by IPython at
93 startup time.
94 """
95 # You can register the class itself without instantiating it. IPython will
96 # call the default constructor on it.
97 ipython.register_magics(MyMagics)
93
98
94 If you want to create a class with a different constructor that holds
99 If you want to create a class with a different constructor that holds
95 additional state, then you should always call the parent constructor and
100 additional state, then you should always call the parent constructor and
96 instantiate the class yourself before registration:
101 instantiate the class yourself before registration:
97
102
98 .. sourcecode:: python
103 .. sourcecode:: python
99
104
100 @magics_class
105 @magics_class
101 class StatefulMagics(Magics):
106 class StatefulMagics(Magics):
102 "Magics that hold additional state"
107 "Magics that hold additional state"
103
108
104 def __init__(self, shell, data):
109 def __init__(self, shell, data):
105 # You must call the parent constructor
110 # You must call the parent constructor
106 super(StatefulMagics, self).__init__(shell)
111 super(StatefulMagics, self).__init__(shell)
107 self.data = data
112 self.data = data
108
113
109 # etc...
114 # etc...
110
115
111 # This class must then be registered with a manually created instance,
116 def load_ipython_extension(ipython):
112 # since its constructor has different arguments from the default:
117 """
113 ip = get_ipython()
118 Any nodule file that define a function named load_ipython_extension can
114 magics = StatefulMagics(ip, some_data)
119 be loaded via `load_ext` or be configured to be autoloaded by IPython at
115 ip.register_magics(magics)
120 startup time.
121 """
122 # This class must then be registered with a manually created instance,
123 # since its constructor has different arguments from the default:
124 magics = StatefulMagics(ip, some_data)
125 ipython.register_magics(magics)
116
126
117
127
118 .. note::
128 .. note::
119
129
120 In early IPython versions 0.12 and before the line magics were
130 In early IPython versions 0.12 and before the line magics were
121 created using a :func:`define_magic` API function. This API has been
131 created using a :func:`define_magic` API function. This API has been
122 replaced with the above in IPython 0.13 and then completely removed
132 replaced with the above in IPython 0.13 and then completely removed
123 in IPython 5. Maintainers of IPython extensions that still use the
133 in IPython 5. Maintainers of IPython extensions that still use the
124 :func:`define_magic` function are advised to adjust their code
134 :func:`define_magic` function are advised to adjust their code
125 for the current API.
135 for the current API.
General Comments 0
You need to be logged in to leave comments. Login now