platform-specific overrides of functions and class methods (expanding on imputils demo code)

lkcl luke.leighton at googlemail.com
Mon Aug 17 09:03:57 EDT 2009


thought that people might like to know: i found also that imputil, the
standard python module, was lacking the necessary complexity in being
a substitute for the standard __import__ function.

the additions required were very simple:

    # note the addition of level=-1 which is ignored

    def _import_hook(self, fqname, globals=None, locals=None,
fromlist=None,
                           level=-1):

        .....

        # Grrr, some people "import os.path" or do "from os.path
import ..."
        if len(parts) == 2 and hasattr(top_module, parts[1]):
            if fromlist:
                return getattr(top_module, parts[1])
            else:
                return top_module

        # assume that the module has already been imported,
        # walk from top_module to find it.
        mod = top_module

        for k in parts[1:]:
            if not hasattr(mod, k):
                print "no mod", mod, k, parts
                mod = None
                break
            mod = getattr(mod, k)

        if mod:
            return mod

        # If the importer does not exist, then we have to bail. A
missing
        # importer means that something else imported the module, and
we have
        # no knowledge of how to get sub-modules out of the thing.
        raise ImportError, 'No module named ' + fqname

it's the module-walking that's been added: going from the "top"
module, looking for an attribute of the split-parts.  this code makes
the assumption that if top module already exists, and it has a sub-
module, and that has a sub-sub-module, and that has a sub-sub-sub-
module etc. then it is perfectly reasonable to return that pre-
existing, already-imported [sub-]+ module as the return result.

the reason why this had to be added is because comtypes.gen.{some
module} auto-generator relies on it, and calls __import__ *direct*.

if somebody would like to add this to the python bugtracker, as a
contribution, that would be great.  alternatively, you might like to
have a word with the python developers to get them to remove the
censorship on my contributions.

l.



More information about the Python-list mailing list