James Gardner: Home > Blog > 2009 > Relative Imports for Web Frameworks

Relative Imports for Web Frameworks

Posted:2009-06-04 16:56
Tags:Pylons, Python, Web

As some of you will know I've been looking at ways of simplifying web development to the point users don't need a framework at all, or can build their own. Every now and again I design some feature or another and then look around to see if there are any ways to achieve the same result with existing tools.

This week I've been looking at a way to remove the need to auto-generate projects using tools like paster create. Wouldn't it be much nicer to just copy and paste an existing project?

Well, if you design your code carefully you can, you just need to ensure that you never reference the package name in your framework or application code. Instead the package name simply becomes a config file option.

Python 2.5 supports relative imports out of the box (I thought I'd need to do some trickery like from __future__ import something but it isn't necessary). As long as all import statements in your code use relative imports everything works nicely.

Here's a demo of relative imports:

mkdir A
touch A/__init__.py
mkdir A/B
touch A/B/__init__.py
mkdir A/B/C
cat << EOF > A/B/C/__init__.py
from .D import message
print message
cat << EOF > A/B/C/D/__init__.py
message = "Imported module D with a relative import"

Now load a Python 2.5 prompt and type this:

$ python2.5
>>> import A.B.C
Imported module D with a relative import

As you can see the relative import statement in A/B/C/__init__py successfully imports the message from D so it can be printed.

See also:

(view source)

James Gardner: Home > Blog > 2009 > Relative Imports for Web Frameworks