Rewriting __getattr__

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Jan 7 10:41:59 EST 2011


On Fri, 07 Jan 2011 16:47:55 +0200, kost BebiX wrote:

> Well, actually the code you showed doesn't work)

Actually, it does. It just prints a warning message as well. Look 
carefully:


>>>> class A(object):
> ..     def __init__(self):
> ..         self.d = {}
> ..     def __getattr__(self, key):
> ..         try:
> ..             return self.d[key]
> ..         except KeyError:
> ..             raise AttributeError
>>>> from copy import deepcopy
>>>> a = A()
>>>> deepcopy(a)
> Exception RuntimeError: 'maximum recursion depth exceeded while calling
> a Python object' in <type 'exceptions.AttributeError'> ignored 
> Exception RuntimeError: 'maximum recursion depth exceeded while calling
> a Python object' in <type 'exceptions.AttributeError'> ignored 
> 0: <__main__.A object at 0xda0250>


The last thing printed is the deepcopied object.


I've tested the above code in Python versions 2.4 through 3.2 and the 
only one that prints that message is 2.6.


-- 
Steven



More information about the Python-list mailing list