Debugging difficulty in python with __getattr__, decorated properties and AttributeError.
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Thu May 2 20:20:39 EDT 2013
On Fri, 03 May 2013 05:34:40 +0600, Mr. Joe wrote:
> Is there any way to raise the original exception that made the call to
> __getattr__?
No. There is some discussion on the Python-Dev mailing list about adding
better error reporting to AttributeError, but that may not go anywhere,
and even if it does, it won't help you until you have dropped all support
for versions below Python 3.4 or 3.5.
> class BackupAlphabet(object):
> pass
>
>
> class Alphabet(object):
> @property
> def a(self):
> return backupalphabet.a
This raises AttributeError. Since __getattr__ uses AttributeError to
decide whether or not the name exists, the behaviour shown is correct:
Alphabet.a does not exist, as far as the Python semantics of attribute
access are concerned.
Either write better code *wink* that doesn't raise AttributeError from
inside properties, or wrap them with something like this:
class Alphabet(object):
@property
def a(self):
try:
return backupalphabet.a
except AttributeError:
raise MyCustomError
where MyCustomError does NOT inherit from AttributeError.
If you're doing this a lot, you can create a decorator to do the wrapping.
--
Steven
More information about the Python-list
mailing list