New submission from Andrew Lutomirski: I'll admit that what I'm doing is possibly unhealthy. Nonetheless, I find this behavior *extremely* surprising. This code:
--- start code --- import datetime class my_dt(datetime.datetime): def __new__(cls, *args, **kwargs): print('In my_dt.__new__') return datetime.datetime.__new__(cls, *args, **kwargs) def __init__(self, *args, **kwargs): print('In my_dt.__init__') super(my_dt, self).__init__() dt = datetime.datetime.now() print('Create a my_dt') t = my_dt(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo) print('Calling replace') t2 = t.replace(tzinfo=None) print('Got a %r' % type(t2)) --- end code --- results in: Create a my_dt In my_dt.__new__ In my_dt.__init__ Calling replace Got a <class '__main__.my_dt'> So datetime.datetime.replace will create an object of type my_dt *without calling __new__ or __init__*. This should (AFAIK) be impossible. I think that datetime.datetime.replace should either return an actual datetime object or that it should invoke __new__ and probably __init__. ---------- components: Library (Lib) messages: 208980 nosy: Andrew.Lutomirski priority: normal severity: normal status: open title: datetime.datetime.replace bypasses a subclass's __new__ versions: Python 3.3 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue20371> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com