[Import-sig] Re: [Python-Dev] Proposal for a modified import mechanism.

Prabhu Ramachandran Prabhu Ramachandran <prabhu@cyberwaveindia.com>
Sun, 11 Nov 2001 10:05:13 +0530

>>>>> "GMcM" == Gordon McMillan <gmcm@hypernet.com> writes:

    GMcM> [Prabhu works on knee.py]

    >> it also fixes a bug where the parent package is an extension
    >> module.

    GMcM> Python provides no support for an extension module being a
    GMcM> package parent module. More precisely, I think the fact that
    GMcM> an extension module can be made to behave like a package
    GMcM> parent module is an accident. There is special code in
    GMcM> import for modules named __init__, and the code is bypassed
    GMcM> for extension modules.

    GMcM> I suspect you'd have to provide a pretty strong
    GMcM> justification before this would become supported behavior.

I guess this was unclear.  My addition is extremely simple and does
not do anything new.  Here is an illustration

>>> import knee
>>> import Numeric.array
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/local/lib/python2.1/knee.py", line 17, in import_hook
    m = load_tail(q, tail)
  File "/usr/local/lib/python2.1/knee.py", line 68, in load_tail
    m = import_module(head, mname, m)
  File "/usr/local/lib/python2.1/knee.py", line 97, in import_module
    parent and parent.__path__)
AttributeError: 'Numeric' module has no attribute '__path__'

Point is, there is a line in knee.py (line 97 that assumes that there
is a __path__ attribute for the passed parent.  However, if parent is
an extension module there is none.  So I simply modified it.  Here is
the diff.

$ diff  knee.py  /usr/local/lib/python2.1/knee.py
<     except (ImportError, AttributeError):
<         # extension modules dont have a __path__ attribute.
<         # caching failures.
<         sys.modules[fqname] = None
>     except ImportError:

In fact that is all I changed in knee.py!  Which is why I said the
changes are very small.  Maybe I should have shown a patch but the
mail was already long.