# HG changeset patch # User Paul Boddie # Date 1192577493 -7200 # Node ID 63fdd990941208dbfd34b36d0498c07eadea9390 # Parent c6101e50e385fb06828ca38b3cda107c146d6308 Fixed naming of imported modules. Added improved support for "lazy" importing. Added commented-out test for direct file parsing. diff -r c6101e50e385 -r 63fdd9909412 micropython/__init__.py --- a/micropython/__init__.py Wed Oct 17 01:00:30 2007 +0200 +++ b/micropython/__init__.py Wed Oct 17 01:31:33 2007 +0200 @@ -52,7 +52,7 @@ self.path = path or [os.getcwd()] self.modules = {} - self.loaded = set() + self.loading = set() def get_modules(self): @@ -143,7 +143,8 @@ """ print "Loading", name - if self.modules.has_key(name) and self.modules[name] in self.loaded: + if self.modules.has_key(name) and self.modules[name].loaded: + print "Cached", name return self.modules[name] # Split the name into path components, and try to find the uppermost in @@ -152,21 +153,20 @@ path = name.split(".") m = self.find_in_path(path[0]) if not m: + print "Not found", path[0] return None # NOTE: Import error. d, filename = m # Either acquire a reference to an already-imported module, or load the # module from a file. - if self.modules.has_key(path[0]): - top = module = self.modules[path[0]] - else: - top = module = self.load_from_file(filename, path[0]) + top = module = self.load_from_file(filename, path[0]) # For hierarchical names, traverse each path component... if len(path) > 1: if not d: + print "No package", filename return None # NOTE: Import error (package not found). else: self.add_submodules(d, module) @@ -179,16 +179,14 @@ m = self.find(d, p) if not m: + print "Not found", p return None # NOTE: Import error. d, filename = m module_name = ".".join(path_so_far) # Either reference an imported module or load one from a file. - if self.modules.has_key(module_name): - submodule = self.modules[module_name] - else: - submodule = self.load_from_file(filename, module_name) + submodule = self.load_from_file(filename, module_name) if d: self.add_submodules(d, module) @@ -215,15 +213,17 @@ module_name = "__main__" module = self.add_module(module_name) - - print "Parsing", name - module.parse(name) - print "Done", name + if not module.loaded and module not in self.loading: + self.loading.add(module) + print "Parsing", name + module.parse(name) + print "Done", name + self.loading.remove(module) + module.loaded = 1 # Record the module. - self.loaded.add(module) - #print "Loaded", module_name, "with namespace", module.namespace.keys() + print "Loaded", module_name #, "with namespace", module.namespace.keys() return module def add_module(self, module_name): diff -r c6101e50e385 -r 63fdd9909412 micropython/inspect.py --- a/micropython/inspect.py Wed Oct 17 01:00:30 2007 +0200 +++ b/micropython/inspect.py Wed Oct 17 01:31:33 2007 +0200 @@ -62,6 +62,7 @@ self.name = name self.importer = importer + self.loaded = 0 # Module namespace. @@ -140,6 +141,12 @@ visitAssTuple = visitAssList + visitAugAssign = NOP + + visitBitand = NOP + + visitBitor = NOP + visitCallFunc = NOP def visitClass(self, node): @@ -183,10 +190,14 @@ for name, alias in node.names: if name != "*": - self.namespace[alias or name] = module.namespace[name] + self.namespace[alias or name] = attr = module.namespace[name] + if isinstance(attr, Module) and not attr.loaded: + self.importer.load(attr.name) else: for n in module.namespace.keys(): - self.namespace[n] = module.namespace[n] + self.namespace[n] = attr = module.namespace[n] + if isinstance(attr, Module) and not attr.loaded: + self.importer.load(attr.name) return None @@ -221,7 +232,10 @@ raise InspectError, "Please use the micropython.Importer class for code which uses the 'import' statement." for name, alias in node.names: - self.namespace[alias or name] = self.importer.load(name, 1) + if alias is not None: + self.namespace[alias] = self.importer.load(name, 1) + else: + self.namespace[name.split(".")[0]] = self.importer.load(name) return None @@ -232,6 +246,8 @@ def visitModule(self, node): return self.dispatch(node.node) + visitMul = NOP + def visitName(self, node): name = node.name if name == "self": diff -r c6101e50e385 -r 63fdd9909412 test.py --- a/test.py Wed Oct 17 01:00:30 2007 +0200 +++ b/test.py Wed Oct 17 01:31:33 2007 +0200 @@ -4,5 +4,6 @@ import sys i = micropython.Importer(sys.path) m = i.load("micropython") +#m = i.load_from_file("micropython/__init__.py") # vim: tabstop=4 expandtab shiftwidth=4