diff --git a/src/_time_machine.c b/src/_time_machine.c index e45c675b..53398509 100644 --- a/src/_time_machine.c +++ b/src/_time_machine.c @@ -72,7 +72,21 @@ _time_machine_original_now( return NULL; // Propagate AttributeError } - PyObject *result = state->original_now(datetime_class, args, nargs, kwnames); + PyObject *result; + if (state->original_now == NULL) { + PyCFunctionObject *datetime_datetime_now = + (PyCFunctionObject *)PyObject_GetAttrString(datetime_class, "now"); + if (datetime_datetime_now == NULL) { + Py_DECREF(datetime_class); + Py_DECREF(datetime_module); + return NULL; // Propagate AttributeError + } + result = _PyObject_Vectorcall((PyObject *)datetime_datetime_now, args, nargs, kwnames); + Py_DECREF(datetime_datetime_now); + } + else { + result = state->original_now(datetime_class, args, nargs, kwnames); + } Py_DECREF(datetime_class); Py_DECREF(datetime_module); diff --git a/tests/test_time_machine.py b/tests/test_time_machine.py index c58f770f..a1906ea3 100644 --- a/tests/test_time_machine.py +++ b/tests/test_time_machine.py @@ -996,6 +996,9 @@ def test_datetime_now(self): eh_now = time_machine.escape_hatch.datetime.datetime.now() assert eh_now >= real_now + eh_now2 = time_machine.escape_hatch.datetime.datetime.now() + assert eh_now2 >= eh_now + def test_datetime_now_tz(self): real_now = dt.datetime.now(tz=dt.timezone.utc)