##// END OF EJS Templates
Inform in the docs about removal of define_magic.
Pavol Juhas -
Show More
@@ -1,133 +1,125 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. This code must be placed in a file that is loaded once
88 # IPython is up and running:
88 # IPython is up and running:
89 ip = get_ipython()
89 ip = get_ipython()
90 # You can register the class itself without instantiating it. IPython will
90 # You can register the class itself without instantiating it. IPython will
91 # call the default constructor on it.
91 # call the default constructor on it.
92 ip.register_magics(MyMagics)
92 ip.register_magics(MyMagics)
93
93
94 If you want to create a class with a different constructor that holds
94 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
95 additional state, then you should always call the parent constructor and
96 instantiate the class yourself before registration:
96 instantiate the class yourself before registration:
97
97
98 .. sourcecode:: python
98 .. sourcecode:: python
99
99
100 @magics_class
100 @magics_class
101 class StatefulMagics(Magics):
101 class StatefulMagics(Magics):
102 "Magics that hold additional state"
102 "Magics that hold additional state"
103
103
104 def __init__(self, shell, data):
104 def __init__(self, shell, data):
105 # You must call the parent constructor
105 # You must call the parent constructor
106 super(StatefulMagics, self).__init__(shell)
106 super(StatefulMagics, self).__init__(shell)
107 self.data = data
107 self.data = data
108
108
109 # etc...
109 # etc...
110
110
111 # This class must then be registered with a manually created instance,
111 # This class must then be registered with a manually created instance,
112 # since its constructor has different arguments from the default:
112 # since its constructor has different arguments from the default:
113 ip = get_ipython()
113 ip = get_ipython()
114 magics = StatefulMagics(ip, some_data)
114 magics = StatefulMagics(ip, some_data)
115 ip.register_magics(magics)
115 ip.register_magics(magics)
116
117
118 In earlier versions, IPython had an API for the creation of line magics (cell
119 magics did not exist at the time) that required you to create functions with a
120 method-looking signature and to manually pass both the function and the name.
121 While this API is no longer recommended, it remains indefinitely supported for
122 backwards compatibility purposes. With the old API, you'd create a magic as
123 follows:
124
116
125 .. sourcecode:: python
126
117
127 def func(self, line):
118 .. note::
128 print("Line magic called with line:", line)
129 print("IPython object:", self.shell)
130
119
131 ip = get_ipython()
120 In early IPython versions 0.12 and before the line magics were
132 # Declare this function as the magic %mycommand
121 created using a :func:`define_magic` API function. This API has been
133 ip.define_magic('mycommand', func)
122 replaced with the above in IPython 0.13 and then completely removed
123 in IPython 5. Maintainers of IPython extensions that still use the
124 :func:`define_magic` function are advised to adjust their code
125 for the current API.
General Comments 0
You need to be logged in to leave comments. Login now