[Python-Dev] New and Improved Import Hooks (original) (raw)

Fredrik Lundh fredrik@pythonware.com
Thu, 5 Dec 2002 14:33:57 +0100


Guido wrote:

Obviously if the data files get stored in the zip file too, the code searching for it needs to be made zip file aware; but if zip files are used to provide other libraries, that shouldn't break code that looks for data files along sys.path.

as I might have mentioned before, it would be really nice if custom importers supported optional "load_data" and "get_module_names" hooks.

the former can be used by code that looks for data files on the path (Zope, PIL, most likely hundreds of other tools/programs):

for path in sys.path:
    if hasattr(path, "load_data"):
        try:
            data =3D path.load_data(name)
        except IOError:
            pass
        else:
            return data # got it
    if isinstance(path, types.StringTypes) and os.path.isdir(path):
        try:
            data =3D open(os.path.join(path, file)
        except IOError:
            pass
        else:
            return data
    # ...

the latter can be used by code that looks for plugins using a name pattern (PIL's *ImagePlugins, for example):

for path in sys.path:
    if hasattr(path, "get_module_names"):
        names =3D path.get_module_names()
    elif isinstance(path, types.StringTypes) and =

os.path.isdir(path): names =3D os.listdir(path) else: continue for name in names: if name.endswith("ImagePlugin"): import(name)

(stupid idea: why not change os.path.isdir to return False for non- string arguments? it's a predicate function, after all...)