T
Thomas Rast
Hello
I've found out about a fundamental problem of attribute lookup, the
hard way.
asyncore.py uses the following code:
class dispatcher:
# ...
def __getattr__(self, attr):
return getattr(self.socket, attr)
Now suppose that I'm asking for some attribute not provided by
dispatcher: The lookup mechanism will apparently try to find it
directly and fail, generating an AttributeError; next it will call
__getattr__ to find the attribute. So far, no problems.
But I used a property much like this:
.... def _get_foo(self):
.... # caused by a bug, several stack levels deeper
.... raise AttributeError('hidden!')
.... foo = property(_get_foo)
....
and as the error message suggests, the original AttributeError is
hidden by the lookup mechanism:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/asyncore.py", line 366, in __getattr__
return getattr(self.socket, attr)
AttributeError: 'NoneType' object has no attribute 'foo'
Is there anything that can be done about this? If there are no better
solutions, perhaps the documentation for property() could point out
this pitfall?
- Thomas
I've found out about a fundamental problem of attribute lookup, the
hard way.
asyncore.py uses the following code:
class dispatcher:
# ...
def __getattr__(self, attr):
return getattr(self.socket, attr)
Now suppose that I'm asking for some attribute not provided by
dispatcher: The lookup mechanism will apparently try to find it
directly and fail, generating an AttributeError; next it will call
__getattr__ to find the attribute. So far, no problems.
But I used a property much like this:
.... def _get_foo(self):
.... # caused by a bug, several stack levels deeper
.... raise AttributeError('hidden!')
.... foo = property(_get_foo)
....
and as the error message suggests, the original AttributeError is
hidden by the lookup mechanism:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/asyncore.py", line 366, in __getattr__
return getattr(self.socket, attr)
AttributeError: 'NoneType' object has no attribute 'foo'
Is there anything that can be done about this? If there are no better
solutions, perhaps the documentation for property() could point out
this pitfall?
- Thomas