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

Nikolaus Rath Nikolaus at rath.org
Tue Jan 21 03:44:51 CET 2014


Serhiy Storchaka <storchaka at gmail.com> writes:

20.01.14 06:19, Nikolaus Rath написав(ла):

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? /*[clinic input] time.gmtime [ seconds: timet ] /

Ahh, interesting. So this works, but now the C default is evaluated even if the user passed an argument (so that answers my question about decreased performance in the other subthread). The generated code is:

time_gmtime(PyModuleDef *module, PyObject *args) { PyObject *return_value = NULL; int group_right_1 = 0; time_t seconds = time(NULL);

switch (PyTuple_GET_SIZE(args)) {
    case 0:
        break;
    case 1:
        if (!PyArg_ParseTuple(args, "O&:gmtime", PyObject_to_time_t, &seconds))
            return NULL;
        group_right_1 = 1;
        break;
    default:
        PyErr_SetString(PyExc_TypeError, "time.gmtime requires 0 to 1 arguments");
        return NULL;
}
return_value = time_gmtime_impl(module, group_right_1, seconds);

All in all, I'm still not sure how I'm supposed to proceed. I see the following options (and I'm fine with all of them):

  1. Use the option group with a custom converter. This means a time(NULL) call even if the caller passed a parameter.

  2. Declare the _impl parameter as PyObject* instead of time_t, and explicitly call a C conversion function.

  3. Patch clinic.py to only evaluate the C default if the caller does not pass a parameter. This seemest cleanest, but I don't know if the design of clinic.py actually allows that.

Best, 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