[IPython-dev] Should we disable autocall by default from now on?
Robert Kern
robert.kern at gmail.com
Wed Nov 30 06:18:52 EST 2011
On 11/30/11 7:07 AM, Fernando Perez wrote:
> Hi folks,
>
> over the years, we've had a number of bug reports that ultimately boil
> down to ipython doing an extra getattr call on objects at the prompt,
> such as
>
> https://github.com/ipython/ipython/issues/988
> https://github.com/ipython/ipython/issues/851
>
> While this may appear odd, people do have code out there that mutates
> the state of objects on simple getattr calls, and so *any*
> introspection on such objects, no matter how carefully done, mutates
> them. The last example comes from Traits code, which is famous for
> having complex semantics attached to attribute access.
>
> Since this is a recurring problem, I'm trying to decide whether the
> convenience of autocall being on by default is worth against the
> occasional surprise of situations like these.
>
> Obviously we'd leave the functionality of autocall as-is, and people
> could still enable it if they wanted to. I'm only talking about
> whether it should be completely off by default. The reason why
> defaults matter a lot is that the vast majority of users never ever
> change them (I've seen countless long-term users with the wrong colors
> for a light bacgkround, the one default we can't pick for them and
> that leads to unreadable tracebacks, yet people live with it for
> years). So it's up to us to give people defaults that lead to the
> best experience possible.
>
> I personally had always fallen on the side of saying that autocall is
> a big convenience of ipython, and that code that mutates on simple
> attribute access is special enough that we shouldn't sacrifice that
> convenience for most users to accommodate such a special case.
I don't think it's *that* special of a case. There are all kinds of good reasons
to set up a special case for the first time an attribute is looked up while
mutating the object to let future lookups go through a different path.
*Usually*, getting the attribute in the autocall code is innocuous, but
sometimes it isn't.
I've always been in favor of turning autocall off by default, though I can't
really say that I have a strong argument beyond personal preference. I don't
like to keep two parallel Python syntaxes in my head (and muscle memory!),
especially when one of them is only informally specified and only works in one
specific environment.
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the IPython-dev
mailing list