[Python-Dev] imputil modifications

Dave Hawkes daveh@cadlink.com
Sun, 19 May 2002 17:24:17 -0400


(Repost with correct attachment!)


Hi,

Recently I tried to use the imputil and module and noticed that it had a few
shortcomings, particularly in an environment like pythonwin.

I implemented a few changes/additions (applicable to python 2.2 and up) to
imputil (attached in newimputil.zip) to fix these problems, without breaking
its basic structure.

Issues addressed:

1) Objects in sys.path can break some other modules.

A function has been created to make these objects appear like strings so we
can do this for example:

sys.path.insert(0, StringedImporter(BuiltinImporter()))

The StringedImporter function will take a class instance and return another
instance derived from str that also contains the Importer functionality.


2) Chaining to previous (foreign) import handlers supported if desired.

A previously installed import handler can be used as shown by this example:

im = ImportManager()
im.install(chain=1)

chain must be true to enable chaining as it is disabled by default so
current assumptions should not be broken.


3) reload is implemented.

An initial crude implementation of reload is provided as a starting point.
An override in the Importer class can be coded to improve it in specific
cases.



Here is an example of code that will work for pythonwin:

#======================================
import sys, new

from newimputil import *

class TestImporter(Importer):
    def get_code(self, parent, modname, fqname):
        if modname == 'xyzzy':
            def test():
                return 'magic!'
            m = new.module('modname')
            vars(m)['test'] = test
            return (0, m, {})
        return None

im = ImportManager()
im.install(chain=1)
sys.path.insert(0, StringedImporter(TestImporter()))

import xyzzy

print xyzzy.test()
#=======================================


Any comments as to whether these changes are worth persuing?

Thanks
Dave Hawkes






begin 666 newimputil.zip
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
M```-``````````$`( ````````!N97=I;7!U=&EL+G!Y4$L%!@`````!``$`
*.P```+0B````````
`
end