why not datetime.strptime() ?
David M. Cooke
cookedm+news at physics.mcmaster.ca
Mon Jan 10 22:53:05 EST 2005
Joshua Spoerri <josh at yucs.org> writes:
> Skip Montanaro <skip <at> pobox.com> writes:
>> josh> Shouldn't datetime have strptime?
>> If someone wants to get their feet wet with extension module
>> programming
>> this might be a good place to start. Mostly, I think nobody who has
>> needed/wanted it so far has the round tuits available to spend on the
>> task.
>
> OK, it was pretty straightforward. Thanks for the direction.
>
> To whom should I send the patch (attached)?
Submit it to the patch tracker on sourceforge.
But first, some constructive criticism:
> --- Modules/datetimemodule.c.orig 2003-10-20 10:34:46.000000000 -0400
> +++ Modules/datetimemodule.c 2005-01-10 20:58:38.884823296 -0500
> @@ -3774,6 +3774,32 @@
> return result;
> }
>
> +/* Return new datetime from time.strptime(). */
> +static PyObject *
> +datetime_strptime(PyObject *cls, PyObject *args)
> +{
> + PyObject *result = NULL, *obj, *module;
> + const char *string, *format;
> +
> + if (!PyArg_ParseTuple(args, "ss:strptime", &string, &format))
> + return NULL;
> + if ((module = PyImport_ImportModule("time")) == NULL)
> + return NULL;
> + obj = PyObject_CallMethod(module, "strptime", "ss", string, format);
> + Py_DECREF(module);
You don't check for errors: an exception being thrown by
PyObject_CallMethod will return obj == NULL.
If there's a module in sys.path called time that overrides the stdlib
time, things will fail, and you should be able to catch that.
> + result = PyObject_CallFunction(cls, "iiiiiii",
> + PyInt_AsLong(PySequence_GetItem(obj, 0)),
> + PyInt_AsLong(PySequence_GetItem(obj, 1)),
> + PyInt_AsLong(PySequence_GetItem(obj, 2)),
> + PyInt_AsLong(PySequence_GetItem(obj, 3)),
> + PyInt_AsLong(PySequence_GetItem(obj, 4)),
> + PyInt_AsLong(PySequence_GetItem(obj, 5)),
> + PyInt_AsLong(PySequence_GetItem(obj, 6)));
Are you positive those PySequence_GetItem calls will succeed? That
they will return Python integers?
> + Py_DECREF(obj);
> + return result;
> +}
> +
> /* Return new datetime from date/datetime and time arguments. */
> static PyObject *
> datetime_combine(PyObject *cls, PyObject *args, PyObject *kw)
> @@ -4385,6 +4411,11 @@
> PyDoc_STR("timestamp -> UTC datetime from a POSIX timestamp "
> "(like time.time()).")},
>
> + {"strptime", (PyCFunction)datetime_strptime,
> + METH_VARARGS | METH_CLASS,
> + PyDoc_STR("strptime -> new datetime parsed from a string"
> + "(like time.strptime()).")},
> +
> {"combine", (PyCFunction)datetime_combine,
> METH_VARARGS | METH_KEYWORDS | METH_CLASS,
> PyDoc_STR("date, time -> datetime with same date and time fields")},
It probably would help to add some documentation to add to the
datetime module documentation.
--
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke
|cookedm(at)physics(dot)mcmaster(dot)ca
More information about the Python-list
mailing list