[Python-Dev] Re:import.c
Wiktor Sadowski
art at wiktorsadowski.com
Sat May 29 15:46:42 EDT 2004
Circular import cases could be detected
by adding an int "state" field (initialized to 0 in PyModule_New)
to the module object and PyModule_GetState/PyModule_SetState api functions
to access the field.
Then:
in load_module (import.c) set the state to 1 ,when a module is completly
loaded:
/*just before return*/
if(m)
PyModule_SetState(m,1)
return m;
----------------------------------------------------------------------------
--------
in import_from (ceval.c):
if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
if(!PyModule_GetState(v))
/*raise the error and warn against circular import*/
else
/*default error*/
----------------------------------------------------------------------------
--------
the same in PyGeneric_GetAttr (object.c):
/* before raising an error*/
if(PyModule_Check(obj) && !PyModule_GetState(obj))
/*add a circular import warning to the error string*/
else
/*default error*/
----------------------------------------------------------------------------
--------
Probably there are some other places where modules state should be changed
or checked but the solution I am proposing would help to localize most of
them;
A module's dict could be used to mark it's state but in my opinion an
additional field
is much safer (the same applays to PyModule_GetState/PyModule_SetState vs a
new member def)
Also:
the soluton would enable checking for partially-loaded/broken modules in
system.modules dict.
Regards,
Wiktor Sadowski
More information about the Python-Dev
mailing list