pythonproperties

Property and __getattr__ compatibility issue with AttributeError


I just encountered an unexpected behavior. This is a simple class with a __getattr__ method and a property attribute with a typo inside:

class A(object):
    def __getattr__(self, attr):
        if not attr.startswith("ignore_"):
            raise AttributeError(attr)

    @property
    def prop(self):
        return self.some_typo

a = A() # Instantiating
a.ignore_this # This is ignored
a.prop # This raises an Attribute Error

This is the expected outcome (the one I get if __getattr__ is commented):

AttributeError: 'A' object has no attribute 'some_typo'

And this is what I get:

AttributeError: prop

I know this has to do with__getattr__ catching the AttributeError but is there a nice and clean workaround for this issue? Because I can assure you, this is a debug nightmare...


Solution

  • You can just raise a better exception message:

    class A(object):
      def __getattr__(self, attr):
        if not attr.startswith("ignore_"):
          raise AttributeError("%r object has not attribute %r" % (self.__class__.__name__, attr))
    
      @property
      def prop(self):
        return self.some_typo
    
    a=A()
    a.ignore_this
    a.prop
    

    EDIT: calling __getattribute__ from object base class solves the problem

    class A(object):
      def __getattr__(self, attr):
        if not attr.startswith("ignore_"):
          return self.__getattribute__(attr)
    
      @property
      def prop(self):
        return self.some_typo