On 02 December 2002, Jonathan Corbet said:
> Fortunately, it's all easy to fix. The following little patch makes the
> publisher look for a function called _q_import when it thinks it's time to
> try importing something.
Hmmmm. Here's an alternative patch that just refactors
Publisher.get_component() a bit (untested):
--- publish.py 20 Nov 2002 19:43:22 -0000 1.140
+++ publish.py 3 Dec 2002 15:20:08 -0000
@@ -424,6 +424,23 @@
pipe.write(msg)
pipe.close()
+ def _import_submodule (self, container, component):
+ """
+ Import a sub-module of 'container' named 'component'.
+ 'container' is a module object, 'component' a name that is
+ supposed to be in the namespace of 'container' but isn't.
+ Presumably, 'component' names a module that has not yet been
+ imported, so this module does the import and returns the
+ resulting module object.
+ """
+ # If we get an ImportError here we don't catch it. It means
+ # either 1) the _q_exports list in 'container' lists something
+ # that doesn't exist (can't be imported), or 2) something raised
+ # an exception at import-time. A traceback should be generated
+ # in either case.
+ mod_name = container.__name__ + '.' + component
+ return _get_module(mod_name)
+
def get_component (self, container, component, path, request):
"""Get one component of a path from a namespace.
"""
@@ -445,13 +462,7 @@
is_module = type(container) is types.ModuleType
has_component = hasattr(container, component)
if is_module and not has_component and component != "_q_index":
- # get next module
- mod_name = container.__name__ + '.' + component
- # If we get an ImportError here we don't catch it. It means
- # that either someone exported something that doesn't exist or
- # an exception was raised from deeping in the code. A
- # traceback should be generated in either case.
- object = _get_module(mod_name)
+ object = self._import_submodule(container, component)
elif has_component:
object = getattr(container, component)
With this, you could just override _import_submodule() and come up with
sub-module names in your own way. Or add support for _q_import without
the indentation going crazy.
> _q_import needs to return an object for the given
> name, just like _get_module does, or it should raise an exception. A nice
> side benefit is that _q_import does not *have* to return a module; if it
> returns a callable object instead, Quixote is happy.
Hmmm, that sounds interesting. Vaguely similar to the generalization of
_q_getname() that I did for 0.5.
> My _q_import also
> stashes the symbol into the container's dictionary so that it doesn't get
> called again for that particular case.
Isn't that done when a sub-module is imported? Or has Quixote been
making a silly assumption all these years? Better go check...
Greg
--
Greg Ward - software developer gward@mems-exchange.org
MEMS Exchange http://www.mems-exchange.org