Comment 3 for bug 244677

Revision history for this message
Angelo Bonet (abonet) wrote : Re: IPython calls an object's __getattr__ inconsistently

Stack-trace showing culprit of __getattr__ call:

In [1]: !cat foo.py

class foo(object):
    def __getattr__(self, attr):
        print 'Getting %r' % attr
        import traceback
        traceback.print_stack()

    def myfunc(self):
        print 'myfunc()'

In [2]: import foo

In [3]: f = foo.foo()

In [4]: f.myfunc()
Getting 'myfunc()'
  File "/home/ab/local/bin/ipython", line 27, in ?
    IPython.Shell.start().mainloop()
  File "/home/ab/local/pythonlib/IPython/Shell.py", line 84, in mainloop
    self.IP.mainloop(banner)
  File "/home/ab/local/pythonlib/IPython/iplib.py", line 1575, in mainloop
    self.interact(banner)
  File "/home/ab/local/pythonlib/IPython/iplib.py", line 1773, in interact
    line = self.raw_input(prompt,more)
  File "/home/ab/local/pythonlib/IPython/iplib.py", line 2196, in raw_input
    lineout = self.prefilter(line,continue_prompt)
  File "/home/ab/local/pythonlib/IPython/iplib.py", line 2279, in multiline_prefilter
    out.append(self._prefilter(l, continue_prompt))
  File "/home/ab/local/pythonlib/IPython/iplib.py", line 2261, in _prefilter
    return prefilter.prefilter(line_info, self)
  File "/home/ab/local/pythonlib/IPython/prefilter.py", line 149, in prefilter
    handler = check(line_info, ip)
  File "/home/ab/local/pythonlib/IPython/prefilter.py", line 277, in checkAutocall
    oinfo = l_info.ofind(ip) # This can mutate state via getattr
  File "/home/ab/local/pythonlib/IPython/prefilter.py", line 72, in ofind
    self._oinfo = ip._ofind(self.iFun)
  File "/home/ab/local/pythonlib/IPython/Magic.py", line 234, in _ofind
    obj = getattr(obj,part)
  File "foo.py", line 6, in __getattr__
    traceback.print_stack()
myfunc()

In [5]: f.myfunc ()
myfunc()