[Python-Dev] Using argument clinic to replace timemodule.c:parse_time_t_args()
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: time_t
> ]
> /
>
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