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