[New-bugs-announce] [issue44876] .replace functions in datetime do not call __new__

Joel Gibson report at bugs.python.org
Mon Aug 9 18:58:31 EDT 2021


New submission from Joel Gibson <joel at jgibson.id.au>:

I've come here while investigating a segfault when datetime.replace(...) was called with a Pandas Timestamp object:
https://github.com/pandas-dev/pandas/issues/42305

The Python implementation of datetime.replace
https://github.com/python/cpython/blob/03e5647ab07c7d2a05094fc3b5ed6eba6fc01349/Lib/datetime.py#L1823
is polymorphic, in the sense that if a custom object like pd.Timestamp is passed in, a pd.Timestamp will come out rather than a datetime. This works just fine (copying and using Python code makes this segfault disappear). 

The C implementation is also polymorphic
https://github.com/python/cpython/blob/03e5647ab07c7d2a05094fc3b5ed6eba6fc01349/Modules/_datetimemodule.c#L5845
but I think that something in the C implementation is wrong: eventually tp_alloc gets called for the passed type, but never tp_new, and then afterwards the custom type is treated just like a regular datetime. In the pd.Timestamp case, there are some extra fields that only get set in the __new__ method, leading to a segfault later when they're accessed.

I'm not familiar enough with the C/CPython interface (especially object setup and initialisation) to tell where a fix for this should go, I would assume that the line
https://github.com/python/cpython/blob/03e5647ab07c7d2a05094fc3b5ed6eba6fc01349/Modules/_datetimemodule.c#L5872
should be replaced by a call to PyObject_new(Py_TYPE(self), ...), or something similar.

This also affects date.replace and time.replace.

----------
components: Library (Lib)
messages: 399295
nosy: joelgibson
priority: normal
severity: normal
status: open
title: .replace functions in datetime do not call __new__
type: behavior

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue44876>
_______________________________________


More information about the New-bugs-announce mailing list