[Python-3000] PEP 3121: Module Initialization and finalization

Brett Cannon brett at python.org
Sun Apr 29 19:12:20 CEST 2007


On 4/29/07, "Martin v. Löwis" <martin at v.loewis.de> wrote:
> Brett,
>
> Thanks for the suggestions; I added them to the PEP.
>
> > How would I raise xx.error in C code now?  I am guessing like this::
>
> Interestingly enough, xxmodule doesn't raise error.
>
> >  PyObject* module = PyState_FindModule(&xxmodule);
>
> Either that, or just use the self parameter if you are in a
> module-level function
>

OK.

> >  if (!module)
> >    return NULL;
> >  PyObject* xx_error = xxstate(module)->ErrorObject;
> >  if (!xx_error) {
> >    PyErr_SetString(PyExc_SystemError, "xx.error missing");
> >    return NULL;
> >  }
>
> That should not fail. If the module object is still present,
> the state shouldn't be cleared normally. So this might
> only occur if the code above is invoked in the "clear cycles"
> phase of garbage collection.
>

Maybe it shouldn't, but can it?  Is there something preventing the
exception object from being cleared beyond people not being stupid?

> > Since most objects will move to being memory-managed, one needs to
> > worry about checking that the object still exists.  I assume I didn't
> > go overboard with the error checking here, right?
>
> It would be good if the check for the NULL exception object could
> be folded in PyErr_SetString (i.e. that raising an internal error
> if the exception class is NULL).
>

Sounds reasonable.

> > I guess people are
> > going to end up writing helper functions to access the various data
> > fields as the above would get rather tedious if you had to write it
> > more than twice.
>
> Over time, we can try to find convenience macro-functions, e.g.
>
>   PyModule_ObjectField(xxmodule, ErrorObject)
>
> which would return a borrowed reference of type PyObject*, or
> NULL (with an exception set) if there is some kind of error.
>

I am sure some will pop up.

> >> Tim Peters reports in [1]_ that PythonLabs considered such a feature
> >> at one point, and lists the following additional hooks which aren't
> >> currently supported in this PEP:
> >>
> >>  * when the module object is deleted from sys.modules
> >>
> >>  * when Py_Finalize is called
> >>
> >>  * when Python exits
> >>
> >
> > Wouldn't the above be covered by the deallocation of the module?
>
> No: deletion from sys.modules might not cause module deallocation,
> if there are other references to the module (although Guido might
> have meant this mean "module deallocation").
>

You're right.  I was not thinking big enough to consider multiple
imports of the same module.

> As for finalization/exiting: normally, all modules should be
> released before Python exits. Again, if there is some garbage
> reference to the module, it may not have been deallocated;
> the question then is whether it should get a further opportunity
> for cleanup.

Eh.  I say no for now and if people really need it we can add the hook later.

-Brett


More information about the Python-3000 mailing list