##// END OF EJS Templates
Merge pull request #8788 from Carreau/automagic...
Min RK -
r21635:e047420c merge
parent child Browse files
Show More
@@ -1,132 +1,133 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 # We delete these to avoid name conflicts for automagic to work
40 # In an interactive session, we need to delete these to avoid
41 # name conflicts for automagic to work on line magics.
41 del lmagic, lcmagic
42 del lmagic, lcmagic
42
43
43
44
44 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
45 :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
46 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
47 IPython object:
48 IPython object:
48
49
49 .. sourcecode:: python
50 .. sourcecode:: python
50
51
51 # 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
52 # 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
53 # doesn't instantiate it yet.
54 # doesn't instantiate it yet.
54 from __future__ import print_function
55 from __future__ import print_function
55 from IPython.core.magic import (Magics, magics_class, line_magic,
56 from IPython.core.magic import (Magics, magics_class, line_magic,
56 cell_magic, line_cell_magic)
57 cell_magic, line_cell_magic)
57
58
58 # The class MUST call this class decorator at creation time
59 # The class MUST call this class decorator at creation time
59 @magics_class
60 @magics_class
60 class MyMagics(Magics):
61 class MyMagics(Magics):
61
62
62 @line_magic
63 @line_magic
63 def lmagic(self, line):
64 def lmagic(self, line):
64 "my line magic"
65 "my line magic"
65 print("Full access to the main IPython object:", self.shell)
66 print("Full access to the main IPython object:", self.shell)
66 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()))
67 return line
68 return line
68
69
69 @cell_magic
70 @cell_magic
70 def cmagic(self, line, cell):
71 def cmagic(self, line, cell):
71 "my cell magic"
72 "my cell magic"
72 return line, cell
73 return line, cell
73
74
74 @line_cell_magic
75 @line_cell_magic
75 def lcmagic(self, line, cell=None):
76 def lcmagic(self, line, cell=None):
76 "Magic that works both as %lcmagic and as %%lcmagic"
77 "Magic that works both as %lcmagic and as %%lcmagic"
77 if cell is None:
78 if cell is None:
78 print("Called as line magic")
79 print("Called as line magic")
79 return line
80 return line
80 else:
81 else:
81 print("Called as cell magic")
82 print("Called as cell magic")
82 return line, cell
83 return line, cell
83
84
84
85
85 # 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
86 # 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
87 # IPython is up and running:
88 # IPython is up and running:
88 ip = get_ipython()
89 ip = get_ipython()
89 # You can register the class itself without instantiating it. IPython will
90 # You can register the class itself without instantiating it. IPython will
90 # call the default constructor on it.
91 # call the default constructor on it.
91 ip.register_magics(MyMagics)
92 ip.register_magics(MyMagics)
92
93
93 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
94 additional state, then you should always call the parent constructor and
95 additional state, then you should always call the parent constructor and
95 instantiate the class yourself before registration:
96 instantiate the class yourself before registration:
96
97
97 .. sourcecode:: python
98 .. sourcecode:: python
98
99
99 @magics_class
100 @magics_class
100 class StatefulMagics(Magics):
101 class StatefulMagics(Magics):
101 "Magics that hold additional state"
102 "Magics that hold additional state"
102
103
103 def __init__(self, shell, data):
104 def __init__(self, shell, data):
104 # You must call the parent constructor
105 # You must call the parent constructor
105 super(StatefulMagics, self).__init__(shell)
106 super(StatefulMagics, self).__init__(shell)
106 self.data = data
107 self.data = data
107
108
108 # etc...
109 # etc...
109
110
110 # This class must then be registered with a manually created instance,
111 # This class must then be registered with a manually created instance,
111 # since its constructor has different arguments from the default:
112 # since its constructor has different arguments from the default:
112 ip = get_ipython()
113 ip = get_ipython()
113 magics = StatefulMagics(ip, some_data)
114 magics = StatefulMagics(ip, some_data)
114 ip.register_magics(magics)
115 ip.register_magics(magics)
115
116
116
117
117 In earlier versions, IPython had an API for the creation of line magics (cell
118 In earlier versions, IPython had an API for the creation of line magics (cell
118 magics did not exist at the time) that required you to create functions with a
119 magics did not exist at the time) that required you to create functions with a
119 method-looking signature and to manually pass both the function and the name.
120 method-looking signature and to manually pass both the function and the name.
120 While this API is no longer recommended, it remains indefinitely supported for
121 While this API is no longer recommended, it remains indefinitely supported for
121 backwards compatibility purposes. With the old API, you'd create a magic as
122 backwards compatibility purposes. With the old API, you'd create a magic as
122 follows:
123 follows:
123
124
124 .. sourcecode:: python
125 .. sourcecode:: python
125
126
126 def func(self, line):
127 def func(self, line):
127 print("Line magic called with line:", line)
128 print("Line magic called with line:", line)
128 print("IPython object:", self.shell)
129 print("IPython object:", self.shell)
129
130
130 ip = get_ipython()
131 ip = get_ipython()
131 # Declare this function as the magic %mycommand
132 # Declare this function as the magic %mycommand
132 ip.define_magic('mycommand', func)
133 ip.define_magic('mycommand', func)
General Comments 0
You need to be logged in to leave comments. Login now