nimp

Nested Imports for Python


Keywords
import, hook, nested, packages, namespace, java-like
License
MIT
Install
pip install nimp==0.9.2

Documentation

Nested Imports (Nimp)
---------------------
Allows nested imports, a la Java. Nimp installs a harmless meta import-hook that 
adds support for *nested packages*, i.e., multiple packages that "live" under a 
common namespace. This is the idiom in Java, where you have packages like 
``com.foo.bar.spam`` and ``com.foo.bar.eggs``, as well as in Haskell and several 
other languages. Nimp basically allows packages to "inject" themselves into 
shared namespaces.

Compatible with Python 2.3-2.7 and 3.0 and up

Usage
^^^^^
::

  import nimp
  nimp.install()

You can add these two lines to your ``site.py`` script, so you'll get Nimp
out of the box. 

Benefits
^^^^^^^^
* Allows for distributing "plug-in" packages independently: consider a project 
  like ``twisted``, made of several add-on packages (but without hacking ``distutils`` 
  too much).
* A project may depend on package ``X.Y`` without having to depend on ``X``.
* These nested-packages can be found anywhere on your python path (they don't have
  to be located in the same directory)
* A small (less than 100 LoC) standalone module that does all the magic for you --
  no third-party cooperation required.

.. note::
  ``distutils`` has problems with directory names that contain dots (as in 
  ``com.ibm.storage``), so Nimp supports **either dots or hyphens** (e.g., 
  ``com-ibm-storage``). This allows you to distribute your package nicely, using
  commonplace distribution mechanisms.
   
  **The recommended way is to use hyphens**, but you may continue to use dots,
  as was the case in previous versions. However, **never mix dots and hyphens** 
  (e.g., ``com.ibm-storage``) -- it will not work.

Example Layout
--------------
Consider the following directory structure, somewhere on your python path 
(say, ``site-packages``)::

  site-packages/
  
    com-ibm-storage/
      files...
    
    com-ibm-storage-plugins/
      files...
    
    com-ibm-pythontools/
      files...

After calling ``nimp.install()``, the following imports will work as expected::

  import com                              # a namespace package (empty)
  import com.ibm                          # a namespace package (empty)
  import com.ibm.pythontools              # a real package
  com.ibm.pythontools.myfunc(1,2,3)
  
  # and of course `from x import y` works too
  from com.ibm.storage import ScsiDisk    
  
  # note how the `plugins` package is "injected" into `storage`
  from com.ibm.storage.plugins import MySQLPlugin