[Python-Dev] Relative import

Ken Manheimer klm at zope.com
Tue Dec 23 12:03:00 EST 2003


On Mon, 22 Dec 2003, Devin wrote:

> The first part stems from Guido's idea about using a '.' at the beginning 
> of a relative import.  It seemed a bit weird at first, but I eventually 
> became very comfortable with the idea after thinking about it in respect 
> to absolute imports.  I'll explain what I mean.
> 
> If you currently want to import a module 'a.b.c.d', you write:
> 
>     import a.b.c.d
> 
> Now, if you're in the module 'a.b', you could still write:
> 
>     import a.b.c.d
> 
> ... but the 'a.b' part is redundant because you're already in the module 
> 'a.b'.  If you take away 'a.b', then you end up with:
> 
>     import .c.d

I also look at it this way, and find it both intuitive and mnemonic.
My model is slighly different than yours, though, in a way that
simplifies the expression for going up the relative chain.  I'll
explain...

> This flowed well in my head, and looks natural.  However, the suggestion
> about '.' or '..' referring to the parent looks _ugly and unnatural_.
> 
> Let's say '.' was used to spell "parent module", and let's assume that 
> the module 'a.b.c.d' wants to import 'a.b.e'.  The absolute import would 
> be spelled:
> 
>     import a.b.e
> 
> ... and the relative import would be spelled:
> 
>     import .....e # .[parent].[parent].e
> 
> Yuck! (no offense :)

Truly, yuck.  But in my model, the leading '.' dot, itself, stands for
the containing package, and '..' stands for the containing package's
package, and so forth:

  import ..e   #  [parent-of-parent].e

I don't think it's yucky at all, this way.  (I also don't think it's
un-pythonic - python uses punctuation all over to denote type literals
('{'/'}'), cues which delineate statement suites (':'), and so forth.)
In fact, i think it's a lot more mnemonic and encompassing than the
alternatives that use words (though i haven't looked at all the
alternatives very carefully yet).

Even using the leading '.' syntax, it would be good to have a specific
identifier for the containing package, realized in each module and
respected as a special identifier by the package machinery.  I like
'__pkg__':

  import __pkg__.sibling                # == 'import .sibling'

and

  import __pkg__.__pkg__.uncle          # == 'import ..uncle'
  import __pkg__.__pkg__.uncle.cousin   # == 'import ..uncle.cousin'

I think the leading '.' dot forms are a lot nicer, but the presence of
a module named '__pkg__' would be useful for programmatically mucking
navigating the package structure.

Ken Manheimer
klm at zope.com




More information about the Python-Dev mailing list