On 05/02/2017 11:16 AM, Jason Maldonis wrote:

Here is the simplest example showing what I mean (there are many more
complicating variations this, and unfortunately I'm running into some of
them):

class A(object):
     def __getattr__(self, attr):
         raise AttributeError("raised from A.__getattr__ to stop execution")

a = A()
print(a.x)

results in:

Traceback (most recent call last):
   File "test.py", line 6, in <module>
     print(a.x)
   File "test.py", line 3, in __getattr__
     raise AttributeError("raised from A.__getattr__ to stop execution")
AttributeError: raised from A.__getattr__ to stop execution

The thing to note here is that the AttributeError on the normal
__getattribute__'s lookup isn't in the stack trace.  That error is:
Traceback (most recent call last):
   File "test2.py", line 35, in <module>
     print(a.x)
AttributeError: 'A' object has no attribute 'x'

-- that last line, "AttributeError: 'A' object has no attribute 'x'" does
not appear in the stack trace for my above example (because __getattr__ is
implemented).  This is because in python's attribute lookup order,
__getattr__ is called if an AttributeError is raised, and that raised
AttributeError gets completely discarded.

So basically I want access to the intermediate AttributeError that caused
__getattr__ to be raised in the first place.

Why?  In most cases* you know which object is missing -- it's the `attr` 
parameter above.

*The exception being an AttributeError raised inside a descriptor.

--
~Ethan~
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to