Properties accessed twice for classes defined interactively #102

Closed
ipython opened this Issue May 10, 2010 · 2 comments

2 participants

@ipython

Original Launchpad bug 297501: https://bugs.launchpad.net/ipython/+bug/297501
Reported by: fdo.perez (Fernando Perez).

Reported on the ipython-user list:

I am experiencing some unusual behavior only when I am directly
working in the ipython shell. The problem involves the get method for
a property.

class MyClass():
   def __init__(self):
       self._x = 3
   def getx(self):
       print "getting x"
       return self._x
   def setx(x):
       print "setting x"
       self._x = x
   x = property(getx, setx)

a = MyClass()
a.x           # prints "getting x" twice
print a.x  # prints "getting x" once

If you stick all this in a file and do 'run test.py', the problem does
not occur. Also, notice that it does not occur in the "print a.x"
statement.

@ipython

[ LP comment 1 by: Fernando Perez, on 2008-11-13 06:47:47.661256+00:00 ]

This is indeed happening, and it's another manifestation of the problems with getattr that have also been reported here:

https://bugs.launchpad.net/ipython/+bug/244677

Similarly, the problem can be avoided by turning %autocall completely off. We still need to investigate whether we can fine-tune %autocall to still work while producing less spurious getattr calls.

@fperez fperez was assigned Apr 10, 2011
@fperez
IPython member

Honestly, I don't think this is fixable while having autocall active. Autocall needs to inspect the objects fairly aggressively and I don't think we can make it work without triggering getattrs. The answer is simply: if your objects have so many side effects that you can't call getattr on them more than once, disable autocall altogether.

Closing here.

@fperez fperez closed this Nov 28, 2011
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment