07.01.2011, 23:48, "Fuzzyman" <fuzzy...@gmail.com>: > On Jan 7, 3:18 pm, kost BebiX <k...@ya.ru>; wrote: > >> 07.01.2011, 17:14, "Jean-Michel Pichavant" <jeanmic...@sequans.com>;: >>> kost BebiX wrote: >>>> š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> >>> It does work as I pasted it with python2.5. >>> recursion problems often occur when overriding __getattr__ or >>> __getattribute__ *AND* accessing self attributes using self.attr form >>> inside the method. >>> try to change >>> ššššreturn self.d[key] >>> into >>> ššššreturn object.__getattribute__(self, 'd')[key] >>> Just speculating though, I cannot test since I don't reproduce the problem. >>> JM >> Yeap, that works. So, is it a python 2.6 bug? Because documentation says >> that __getattr__ is called only after property was not found (and >> __getattr__ was actually invented in a way that you can use self inside it). > > That is true (that __getattr__ is called only if the attribute doesn't > exist), however deepcopy works by creating a new instance *without* > calling __init__. When it is copying the attributes self.d *doesn't* > exist initially. You should work around this case in your __getattr__ > if you want your object to be deep-copyable. > > Michael Foord > -- > http://www.voidspace.org.uk/
Yeah, but, I mean, shouldn't deepcopy copy the attributes before it gets to calling __getattr__? -- http://mail.python.org/mailman/listinfo/python-list