More puzzling behavior while subclassing datetime
wittempj@hotmail.com
martin.witte at gmail.com
Thu Nov 16 03:27:09 EST 2006
insyte at gmail.com wrote:
> With assistance from Gabriel and Frederik (and a few old threads in
> c.l.p.) I've been making headway on my specialized datetime class. Now
> I'm puzzled by behavior I didn't expect while attempting to use some of
> the alternate datetime constructors. Specifically, it appears if I
> call GeneralizedTime.now() it calls the __new__ method of my class but
> treats keyword arguments as if they were positional.
>
> My class:
>
> class GeneralizedTime(datetime):
> def __new__(cls, time=None, *args, **kwargs):
datetime.datetime() takes these arguments: year, month, day[, hour[,
minute[, second[, microsecond[, tzinfo]]]]]), see
http://docs.python.org/lib/datetime-datetime.html
> print time, args, kwargs
> if isinstance(time, str):
> timeValues, tzOffset = cls.stringToTimeTuple(time)
> return datetime.__new__(cls, tzinfo=GenericTZ(tzOffset),
> **timeValues)
> elif isinstance(time, datetime):
> timeValues = time.timetuple()[:6]
time.timetuple() does not exist, see
http://docs.python.org/lib/module-time.html, time is represented as a
tuple. checkout time.mktime() on how to convert to a tuple to a time
> tzOffset = time.utcoffset()
> return datetime.__new__(cls, tzinfo=GenericTZ(tzOffset),
> *timeValues)
> elif time is None:
> print "Still gotta figure out now to do this one..."
> else:
> raise Invalidtime(time)
> @staticmethod
> def stringToTimeTuple(timeString):
> ... regex that parses timeString ...
>
> >>> GeneralizedTime.today()
> 2006 (11, 16, 0, 35, 18, 747275, None) {}
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "gentime.py", line 106, in __new__
> raise InvalidTime(time)
> gentime.InvalidTime: 2006
>
> So it appears the time tuple is being passed to
> GeneralizedTime.__new__, but the first value is being assigned to the
> "time" argument.
>
> Is this a side effect of how datetime is implemented? Or am I doing
> something screwy?
>
> Thanks!
>
> -Ben
A very cutback part of your code gets the basics working:
from datetime import datetime
class Invalidtime(Exception):
pass
class GeneralizedTime(datetime):
def __new__(cls, *args, **kwargs):
if isinstance(args, tuple):
return datetime.__new__(cls, *args)
else:
raise Invalidtime(args)
t = GeneralizedTime.today()
print t.year
print t.month
print t.day
print t.hour
print t.minute
print t.second
print t.microsecond
print t.tzinfo
More information about the Python-list
mailing list