Still the __new__ hell ...

Paulo da Silva psdasilvaX at esotericaX.ptX
Sat Mar 17 19:48:06 EDT 2007


Arnaud Delobelle escreveu:
> On Mar 17, 9:31 pm, Paulo da Silva <psdasil... at esotericaX.ptX> wrote:
...

>> I used __new__ to
>> subclass date class but now cPickle/pickle loads
>> does not work.
>>
>> from datetime import date
>> import cPickle,string
>>
>> class MyDate(date):
>>         def __new__(cls,year,month=None,day=None):
>>                 if type(year) is str:
>>                         year,month,day=map(int,string.split(year,'-'))
>>                 if year<100:
>>                         year+=2000
>>                 return date.__new__(cls,year,month,day)
>>
>> class C1(object):
>>         def __init__(self):
>>                 self.x=MyDate("2007-3-15")
>>
>>         def f(self):
>>                 print self.x
>>
>> c1=C1()
>>
>> d=cPickle.dumps(c1)
>> c2=cPickle.loads(d)
>> c2.f()
> 
> I haven't tried your code but I think that you may need to define a
> __reduce__ method in your MyDate class in order to give a clue to the
> python as to how to pickle its instances.  For more details see:
> 
> http://docs.python.org/lib/node321.html
> 
> Something like:
> 
> class MyDate(date):
>     ...
>     def __reduce__(self):
>         return type(self), (self.year, self.month, self.day)
> 
> might solve your problem.
> 
> HTH
> 
> --
> Arnaud
> 

Thanks. This works exactly the way you wrote.
Yet I am misunderstanding something. Can't pickle "see" that being
MyDate derived from date it also has to look at variables from date?
When do I need to do this? I am using pickle with a lot more complex
classes without this problem.

Thank you
Paulo



More information about the Python-list mailing list