Rewriting __getattr__

kost BebiX kost-bebix at yandex.ua
Fri Jan 7 09:47:55 EST 2011


07.01.2011, 16:22, "Jean-Michel Pichavant" <jeanmichel at sequans.com>:
> kost BebiX wrote:
>>>  You're absolutely right! Now try to do except Keyerror: raise AttributeError and it will also fail. But why?
>>>>  07.01.2011, 15:45, "Jean-Michel Pichavant" <jeanmichel at sequans.com>;:
>>>  kost BebiX wrote:
>>>>   Hi everyone!
>>>>   I just saw a bug (?) in bson.dbref:DBRef.__getattr__
>>>>>>>>   Here's they're code:
>>>>       def __getattr__(self, key):
>>>>           return self.__kwargs[key]
>>>>>>>>   And when you do copy.deepcopy on that object it will raise you KeyError. So here's a small piece of code that reproduces the problem:
>>>  from http://docs.python.org/reference/datamodel.html
>>>>>>  About __getattr__
>>>  "This method should return the (computed) attribute value or raise an
>>>  AttributeError
>>>  <http://docs.python.org/library/exceptions.html#exceptions.AttributeError>
>>>  exception."
>>>>>>  The code you provided raises a KeyError thus methods such as 'getattr'
>>>  will fail as they expect an AttributeError exception.
>>>>>>  JM
>>>>>>  --
>>>  http://mail.python.org/mailman/listinfo/python-list
>> please don't top post :)
>> It fails because you simply did not returned any value (with your class
> A example).
>> class A(object):
>     def __init__(self):
>         self.d = {}
>     def __getattr__(self, key):
>         try:
>             *return* self.d[key]
>         except KeyError:
>             raise AttributeError
>> works fine with deepcopy
>> JM
>> --
> http://mail.python.org/mailman/listinfo/python-list

Sorry for top posting, didn't know about that) I'm quote new to posting to mailing lists.
Well, actually the code you showed doesn't work)
>>> 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>
-- 
jabber: k.bx at ya.ru


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /