Larry Hastings <la...@hastings.org> writes: > All is not lost! What follows is rough pseudo-C code, hopefully you > can take it from here. > > typedef struct { > int set; > time_t when; > } clinic_time_t; > > #define DEFAULT_CLINIC_TIME_T {0, 0} > > static int > parse_clinic_time_t_arg(PyObject *arg, clinic_time_t *ct) > { > if (arg == NULL) > return 1; > if (arg == Py_None) > return 0; > if (_PyTime_ObjectToTime_t(arg, &ct->when) == -1) { > set = 1; > return 0; > } > return 1; > } > > static int post_parse_clinic_time_t(clinic_time_t *ct) { > if (ct->set) > return 0; > ct->when = time(NULL); > return 0; > } > > /*[python input] > class clinic_time_t_converter(CConverter): > type = 'clinic_time_t' > converter = 'parse_clinic_time_t' > c_default = 'DEFAULT_CLINIC_TIME_T' > [python start generated code]*/ > /*[python end generated code: checksum=...]*/ > > Now you can use clinic_time_t. Parameters declared clinic_time_t can > be required, or they can be optional; if they're optional give them a > default value of None. You'll have to call post_parse_clinic_time_t() > by hand in your impl function; I'll see if I can extend Clinic so > converters can emit code after a successful call to the parse function > but before the call to the impl.
Okay, I attached a patch along these lines to the bugtracker. However, I have to say that I lost track of what we're actually gaining with all this. If all we need is a type that can distinguish between a valid time_t value and a default value, why don't we simply use PyObject? In other words, what's the advantage of all the code above over: static int PyObject_to_time_t(PyObject *obj, time_t *when) { if (obj == NULL || obj == Py_None) *when = time(NULL); else if (_PyTime_ObjectToTime_t(obj, when) == -1) return 0; return 1; } /*[clinic input] time.gmtime seconds: object=NULL / [...] static PyObject * time_gmtime_impl(PyModuleDef *module, PyObject *seconds) { PyObject *return_value = NULL; time_t when; if(!PyObj_to_time_t(seconds, &when)) return NULL; [...] To me this version looks shorter and clearer. Is there really an advantage in defining the clinic argument as a custom struct rather than object? 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.« _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com