[Python-Dev] Using argument clinic to replace timemodule.c:parse_time_t_args() (original) (raw)

Nikolaus Rath Nikolaus at rath.org
Mon Jan 20 05:19:07 CET 2014


Larry Hastings <larry at hastings.org> writes:

On 01/18/2014 09:52 PM, Ryan Smith-Roberts wrote:

I still advise you not to use this solution. time() is a system call on many operating systems, and so it can be a heavier operation than you'd think. Best to avoid it unless it's needed (on FreeBSD it seems to add about 15% overhead to localtime(), for instance). I agree. Converting to Argument Clinic should not cause a performance regression. Please don't add new calls to time() for the sake of making code more generic. A better choice would be to write a converter function in C, then use a custom converter that called it. Nikolaus: Is that something you're comfortable doing?

I think I'll need some help. I don't know how to handle the case where the user is not passing anything.

Here's my attempt:

,---- | /* C Converter for argument clinic | If obj is NULL or PyNone, return current time. Otherwise, | convert Python object to timet. | */ | static int | PyObjecttotimet(PyObject *obj, timet *stamp) | { | if (obj == NULL || obj == PyNone) { | *stamp = time(NULL); | } | else { | if (PyTimeObjectToTimet(obj, stamp) == -1) | return 0; | } | return 1; | } || /*[python input] | class timetconverter(CConverter): | type = 'timet' | converter = 'PyObjecttotimet' | default = None | [python start generated code]*/ | /[python end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]/ ||| /*[clinic input] | time.gmtime || seconds: timet | / || [clinic start generated code]*/ `----

but this results in the following code:

,---- | static PyObject * | timegmtime(PyModuleDef *module, PyObject *args) | { | PyObject *returnvalue = NULL; | timet seconds; || if (!PyArgParseTuple(args, | "|O&:gmtime", | PyObjecttotimet, &seconds)) | goto exit; | returnvalue = timegmtimeimpl(module, seconds); || exit: | return returnvalue; | } `----

This works if the user calls time.gmtime(None), but it fails for time.gmtime(). It seems that in that case my C converter function is never called.

What's the trick that I'm missing?

Thanks! -Nikolaus

-- Encrypted emails preferred. PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C

         »Time flies like an arrow, fruit flies like a Banana.«


More information about the Python-Dev mailing list