Status update week 6 GSoC
Finishing up tutorial material
We have been busy adding the final touches to the upcoming tutorial. (you can read about the tutorial in ealier blog posts).
I thought I would share a technique for doing exercises in Jupyter notebooks.
The %exercise magic
There are quite a few ways to provide exercises in jupyter notebooks (eventually I think there will be a de facto standard, either as a separate package or included with the notebook itself). But I essentially wanted a special version of %load which would load a file into a cell but replace some parts of the expressions with gaps for the tutorial attendee to fill in.
Thanks to IPython being a popular project there was already a solution posted on StackOverflow which did nearly exactly this.
After some tweaking I came up with this
import IPython.core.magic as ipym @ipym.magics_class class ExerciseMagic(ipym.Magics): @ipym.line_magic def exercise(self, line, cell=None): token = ' # EXERCISE: ' out_lst = [] for ln in open(line).readlines(): if token in ln: pre, post = ln.split(token) out_lst.append(pre.replace(post.rstrip('\n'), '???') + '\n') else: out_lst.append(ln) out_str = '# %exercise {0}\n{1}'.format(line, ''.join(out_lst)) self.shell.set_next_input(out_str, replace=True) def load_ipython_extension(ipython): ipython.register_magics(ExerciseMagic) def unload_ipython_extension(ipython): pass
The downside of using this magic is that reloading the cell requires the user to uncomment the # %exercise ... line, delete the rest of the cell and rerun it. This will only feel natural if you've already worked with the %load magic before (which in my humble opinion is suboptimal since you often want bi-directional editing whenever you pull out that magic).
Comments
Comments powered by Disqus