[Python-Dev] regrtest.py mystery (original) (raw)

Martin v. Loewis martin@v.loewis.de
Sat, 15 Dec 2001 23:52:17 +0100


What's up with that? So far, they all seem to involve the encodings directory ...

Python/codecs.c holds search functions in _PyCodec_SearchPath, among them encodings.init.search_function. It also imports "encodings" the first time somebody invokes .encode/.decode on some kind of string, but doesn't hold onto the module.

When the last reference to encodings.init goes away, Python will clear all globals - but codecs still holds a reference to search_function, so that won't go away. Invoking search_function later will cause the problem you see.

One solution would be to bind all globals used inside encodings.init.search_function to the search_function, e.g. by means of a class:

class GlobalSearchFunction: _cache = _unknown = class CodecRegistryError(...): def search_function(self,encoding):

codecs.register(GlobalSearchFunction().search_function)

Of course, if this gets cleaned from sys.modules, nobody will be able to catch CodecRegistryError anymore (since re-importing the module will produce a different class).

Regards, Martin