[IPython-dev] Strange property bug?

Paul Mueller gakusei at dakotacom.net
Sat May 19 18:10:40 EDT 2007


On Fri, May 18, 2007 at 07:52:51PM -0700, Anand Patil wrote:
> Hi all,
>
> Here's a script I called 'test.py':
>
> ---------------------------------
>
> class A(object):
>
>     c=1
>
>     def fget(self):
>         self.c=self.c+1
>         print 'Adding 1 to c'
>
>     b=property(fget)
>
> M = A()
>
> ----------------------
>
>
>  From the regular Python shell, the A class works as expected:

...

> But in IPython, the fget function seems to get called twice:

...

> Any ideas?

This is a result of autocall. Trying it with autocall on and off yields:

In [7]:%autocall
Automatic calling is: Smart

In [8]:M.b
Adding 1 to c
Adding 1 to c

In [9]:%autocall
Automatic calling is: OFF

In [10]:M.b
Adding 1 to c

If you want more info:

More specifically, the following line in ipython (in
IPython/prefilter.py's function checkAutocall) is indirectly
responsible, and mentions the problem:

oinfo = l_info.ofind(ip) # This can mutate state via getattr

It is only executed if autocall is on.

If autocall is on, ipython eventually calls getattr(M, 'b') as part of
determining if M.b should be autocalled, then later actually executes
M.b, so fget() ends up getting called twice.

Paul Mueller



More information about the IPython-dev mailing list