[IPython-User] Tab completion doesn't work on class/instance where __getattr__ has been overridden

Jeremy Conlin jlconlin@gmail....
Tue Mar 1 16:55:54 CST 2011


On Tue, Mar 1, 2011 at 3:11 PM, Jörgen Stenarson
<jorgen.stenarson@bostream.nu> wrote:
> Jeremy Conlin skrev 2011-03-01 20:58:
>> I have a class (subclassed from list) where I have overwridden the
>> __getattr__ method as:
>>
>>      def __getattr__(self, name):
>>          if name.startswith("__"): raise AttributeError
>>          def _multiplexed(*args, **kwargs):
>>              return [getattr(R, name)(*args, **kwargs) for R in self]
>>          return _multiplexed
>>
>> Now when I try to use tab completion, iPython just beeps at me and
>> doesn't complete anything.  If I remove this method from my class, I
>> can do tab completion.
>>
>> Does the tab completion use __getattr__ somewhere?  Can I add
>> something to my definition to make tab completion work in iPython?
>>
>
> One way to customize which attributes are found by the completer is to
> define the __dir__ method which essentially defines what should be
> returned by a dir call.

I tried defining __dir__ in my class as:

    def __dir__(self):
        heritage = dir(super(self.__class__, self)) # inherited attributes
        return sorted(heritage + self.__class__.__dict__.keys() +
                self.__dict__.keys())

(I found this example on
http://stackoverflow.com/questions/2531479/hide-deprecated-methods-from-tab-completion)
 However I still didn't get tab completion.  I can call
dir(objectInstance) and get a list of methods and attributes.  I can
call dir(objectInstance) when without __dir__ being defined and also
get a list of methods and attributes.

Any other ideas?
Jeremy


More information about the IPython-User mailing list