[Python-Dev] clarifying PEP 302 loader responsibilities upon failure

Guido van Rossum guido at python.org
Mon Feb 9 23:02:13 CET 2009


On Mon, Feb 9, 2009 at 1:56 PM,  <bcannon at gmail.com> wrote:
> Guido and I were discussing what a loader should be responsible for when
> load_module is called and an exception is raised in relation to sys.modules
> as PEP 302 says nothing about the topic.
>
> We both agree that if the loader added a module to sys.modules it should be
> removed, otherwise it should be left alone.
>
> Assuming no one disagrees I will update the PEP to specify that this is the
> expected job of loaders.

(Note that currently most loaders we've looked at end up removing the
module unconditionally, as this is what PyImport_ExecCodeModuleEx()
does. PyImport_ReloadModule() has a super-duper hack to save the
module object and put it back into sys.modules:

	if (newm == NULL) {
		/* load_module probably removed name from modules because of
		 * the error.  Put back the original module object.  We're
		 * going to return NULL in this case regardless of whether
		 * replacing name succeeds, so the return value is ignored.
		 */
		PyDict_SetItemString(modules, name, m);
	}

If we could get conforming loaders to behave as proposed, we wouldn't
need this ugly hack.

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list