diff options
author | Guido van Rossum <guido@python.org> | 1997-09-09 20:35:20 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-09-09 20:35:20 (GMT) |
commit | 501d0bb7adcc4ce825ff03658dabd5042f6c47d8 (patch) | |
tree | 38691f04572a7d05d06787a332656a6687f12292 | |
parent | a86f77d4dd5dc6dc8062c8645a2f6e5fbba3767d (diff) | |
download | cpython-501d0bb7adcc4ce825ff03658dabd5042f6c47d8.zip cpython-501d0bb7adcc4ce825ff03658dabd5042f6c47d8.tar.gz cpython-501d0bb7adcc4ce825ff03658dabd5042f6c47d8.tar.bz2 |
*** empty log message ***
-rw-r--r-- | Lib/knee.py | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/Lib/knee.py b/Lib/knee.py new file mode 100644 index 0000000..47f65cb --- /dev/null +++ b/Lib/knee.py @@ -0,0 +1,115 @@ +# More structured (slower) alternative to mini + +import sys, imp, __builtin__, string + + +# Replacement for __import__() +def import_hook(name, globals=None, locals=None, fromlist=None): + parent = determine_parent(globals) + q, tail = find_head_package(parent, name) + m = load_tail(q, tail) + if not fromlist: + return q + if hasattr(m, "__path__"): + ensure_fromlist(m, fromlist) + return m + +def determine_parent(globals): + if not globals or not globals.has_key("__name__"): + return None + pname = globals['__name__'] + if globals.has_key("__path__"): + parent = sys.modules[pname] + assert globals is parent.__dict__ + return parent + if '.' in pname: + i = string.rfind(pname, '.') + pname = pname[:i] + parent = sys.modules[pname] + assert parent.__name__ == pname + return parent + return None + +def find_head_package(parent, name): + if '.' in name: + i = string.find(name, '.') + head = name[:i] + tail = name[i+1:] + else: + head = name + tail = "" + if parent: + qname = "%s.%s" % (parent.__name__, head) + else: + qname = head + q = import_module(head, qname, parent) + if q: return q, tail + if parent: + qname = head + parent = None + q = import_module(head, qname, parent) + if q: return q, tail + raise ImportError, "No module named " + qname + +def load_tail(q, tail): + m = q + while tail: + i = string.find(tail, '.') + if i < 0: i = len(tail) + head, tail = tail[:i], tail[i+1:] + mname = "%s.%s" % (m.__name__, head) + m = import_module(head, mname, m) + if not m: + raise ImportError, "No module named " + mname + return m + +def ensure_fromlist(m, fromlist): + for sub in fromlist: + if sub != "*" and not hasattr(m, sub): + subname = "%s.%s" % (m.__name__, sub) + submod = import_module(sub, subname, m) +## if not submod: +## raise ImportError, "No module named " + subname + +def import_module(partname, fqname, parent): + try: + return sys.modules[fqname] + except KeyError: + pass + try: + fp, pathname, stuff = imp.find_module(partname, + parent and parent.__path__) + except ImportError: + return None + try: + m = imp.load_module(fqname, fp, pathname, stuff) + finally: + if fp: fp.close() + if parent: + setattr(parent, partname, m) + return m + + +# Replacement for reload() +def reload_hook(module): + name = module.__name__ + if '.' not in name: + return import_module(name, name, None) + i = string.rfind(name, '.') + pname = name[:i] + parent = sys.modules[pname] + return import_module(name[i+1:], name, parent) + + +# Save the original hooks +original_import = __builtin__.__import__ +original_reload = __builtin__.reload + +# Now install our hooks +__builtin__.__import__ = import_hook +__builtin__.reload = reload_hook + +# pretend we're ni, too +sys.modules['ni'] = sys.modules[__name__] +def ni(): pass +def install(): pass |