[IPython-dev] cell magics
Jason Grout
jason-sage at creativetrax.com
Sat Feb 16 17:54:32 EST 2013
On 2/16/13 4:39 PM, Thomas Kluyver wrote:
> That's quite a lot to read, but while I think about it in more detail, a
> couple of bits that jump out at me:
It was quite a lot to write :).
>
> On 16 February 2013 22:07, Jason Grout <jason-sage at creativetrax.com
> <mailto:jason-sage at creativetrax.com>> wrote:
>
> %time some_function
>
> now I want to add a few more things to the time run. All I have to do
> is change where the string is:
>
> %time
> some_function
> some_other function
>
> and the lack of a string after %time tells me that I should look below
> %time for the string. I don't have to constantly keep adjusting the %
> character(s).
>
>
> For %%timeit, however, we use the remainder of the line as a setup
> statement, before timing the body. Now you can argue that that's a bad
> idea, but it's useful to have that distinction.
%timeit('setup code', runs=4)
some function
some other function
would work fine, right?
Or (more explicitly)
%timeit(runs=4, setup='setup code')
blah
blah
>
> P.S. Actually, after thinking about it more, since a single % is
> ambiguous syntax, I think I would prefer all string decorators be
> invoked with %%, which is invalid python syntax. Then we won't have
> this problem:
>
> cd=5
> a=4\
> %cd
>
> or this problem:
>
> cd=4
> a="time: %d"\
> %cd
>
>
> My input transformation work should handle such cases. Arguably it could
> be done more easily if we used a syntax like %% that could never appear
> in a valid Python statement, but it still wouldn't be trivial:
>
> a = """
> %%foo
> """
But if it's a token-based transformer, it will know %%foo is inside a
string, and it won't see that as a token.
>
> > ...
>
> I think it's pretty clear which statement is more readable. This focus
> on readability over brevity (remember, "Readability counts") is part of
> why python is so good in general.
>
>
> And part of the reason IPython exists is to provide for the cases when
> you do want brevity. Because there are times when you want to type '%run
> -d foo' than 'pdb.runcall(execfile, "foo.py")'.
>
> Of course, IPython has evolved - when it was only a shell, most of what
> you entered was just for single use, so readability wasn't hugely
> important. When you're writing & publishing a notebook, readability is a
> much bigger deal. But I've yet to see a particular problem with people
> abusing magic syntax and making notebooks hard to read.
And it's only the *very*, *very* beginning....
>
> > * backwards compatibility (with IPP and previous IPython versions, as
> > well as IDL and matlab apparently?). But I'll point out that we can
> > easily support this too, in almost exactly the same invocation:
> >
> > %timeit('-r 5 -and -other -options') 2+3
>
> Honestly, I wouldn't call that 'almost the same invocation'. Moreover,
> it sacrifices the brevity without enforcing any corresponding gain in
> readability.
I wasn't advocating for that, of course, I was advocating for the
readable version below.
Thanks,
Jason
More information about the IPython-dev
mailing list