2004-01-31 00:14:16 -05:00
|
|
|
|
PEP: 328
|
2004-01-31 00:19:25 -05:00
|
|
|
|
Title: Imports: Multi-Line and Absolute/Relative
|
2004-01-31 00:14:16 -05:00
|
|
|
|
Version: $Revision$
|
|
|
|
|
Last-Modified: $Date$
|
2004-04-03 10:02:46 -05:00
|
|
|
|
Author: Aahz <aahz@pythoncraft.com>
|
2007-02-17 13:42:37 -05:00
|
|
|
|
Status: Final
|
2004-01-31 00:14:16 -05:00
|
|
|
|
Type: Standards Track
|
|
|
|
|
Content-Type: text/x-rst
|
|
|
|
|
Created: 21-Dec-2003
|
2010-04-21 16:02:37 -04:00
|
|
|
|
Python-Version: 2.4, 2,5, 2.6
|
2004-04-03 10:02:46 -05:00
|
|
|
|
Post-History: 8-Mar-2004
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Abstract
|
|
|
|
|
========
|
|
|
|
|
|
|
|
|
|
The ``import`` statement has two problems:
|
|
|
|
|
|
|
|
|
|
* Long ``import`` statements can be difficult to write, requiring
|
|
|
|
|
various contortions to fit Pythonic style guidelines.
|
|
|
|
|
|
|
|
|
|
* Imports can be ambiguous in the face of packages; within a package,
|
|
|
|
|
it's not clear whether ``import foo`` refers to a module within the
|
2004-04-03 21:37:57 -05:00
|
|
|
|
package or some module outside the package. (More precisely, a local
|
|
|
|
|
module or package can shadow another hanging directly off
|
|
|
|
|
``sys.path``.)
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
For the first problem, it is proposed that parentheses be permitted to
|
|
|
|
|
enclose multiple names, thus allowing Python's standard mechanisms for
|
2004-04-03 21:37:57 -05:00
|
|
|
|
multi-line values to apply. For the second problem, it is proposed that
|
|
|
|
|
all ``import`` statements be absolute by default (searching ``sys.path``
|
|
|
|
|
only) with special syntax (leading dots) for accessing package-relative
|
|
|
|
|
imports.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Timeline
|
|
|
|
|
========
|
|
|
|
|
|
2006-02-18 22:29:42 -05:00
|
|
|
|
In Python 2.5, you must enable the new absolute import behavior with ::
|
2004-04-03 21:37:57 -05:00
|
|
|
|
|
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
2006-02-18 22:29:42 -05:00
|
|
|
|
You may use relative imports freely. In Python 2.6, any ``import``
|
2004-05-02 12:32:32 -04:00
|
|
|
|
statement that results in an intra-package import will raise
|
|
|
|
|
``DeprecationWarning`` (this also applies to ``from <> import`` that
|
2010-04-21 16:02:37 -04:00
|
|
|
|
fails to use the relative import syntax).
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Parentheses
|
|
|
|
|
=========================
|
|
|
|
|
|
|
|
|
|
Currently, if you want to import a lot of names from a module or
|
|
|
|
|
package, you have to choose one of several unpalatable options:
|
|
|
|
|
|
|
|
|
|
* Write a long line with backslash continuations::
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
|
|
|
|
|
LEFT, DISABLED, NORMAL, RIDGE, END
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
* Write multiple ``import`` statements::
|
|
|
|
|
|
|
|
|
|
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
|
|
|
|
|
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END
|
|
|
|
|
|
|
|
|
|
(``import *`` is *not* an option ;-)
|
|
|
|
|
|
|
|
|
|
Instead, it should be possible to use Python's standard grouping
|
|
|
|
|
mechanism (parentheses) to write the ``import`` statement::
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
|
2004-01-31 00:14:16 -05:00
|
|
|
|
LEFT, DISABLED, NORMAL, RIDGE, END)
|
|
|
|
|
|
2004-05-02 12:32:32 -04:00
|
|
|
|
This part of the proposal had BDFL approval from the beginning.
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
2006-02-18 22:29:42 -05:00
|
|
|
|
Parentheses support was added to Python 2.4.
|
|
|
|
|
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
Rationale for Absolute Imports
|
|
|
|
|
==============================
|
|
|
|
|
|
2006-02-18 22:29:42 -05:00
|
|
|
|
In Python 2.4 and earlier, if you're reading a module located inside a
|
2004-01-31 00:14:16 -05:00
|
|
|
|
package, it is not clear whether ::
|
|
|
|
|
|
|
|
|
|
import foo
|
|
|
|
|
|
|
|
|
|
refers to a top-level module or to another module inside the package.
|
2004-05-02 12:32:32 -04:00
|
|
|
|
As Python's library expands, more and more existing package internal
|
|
|
|
|
modules suddenly shadow standard library modules by accident. It's a
|
|
|
|
|
particularly difficult problem inside packages because there's no way to
|
|
|
|
|
specify which module is meant. To resolve the ambiguity, it is proposed
|
|
|
|
|
that ``foo`` will always be a module or package reachable from
|
|
|
|
|
``sys.path``. This is called an absolute import.
|
|
|
|
|
|
|
|
|
|
The python-dev community chose absolute imports as the default because
|
|
|
|
|
they're the more common use case and because absolute imports can provide
|
|
|
|
|
all the functionality of relative (intra-package) imports -- albeit at
|
|
|
|
|
the cost of difficulty when renaming package pieces higher up in the
|
|
|
|
|
hierarchy or when moving one package inside another.
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
Because this represents a change in semantics, absolute imports will
|
2006-02-18 22:29:42 -05:00
|
|
|
|
be optional in Python 2.5 and 2.6 through the use of ::
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
2004-05-02 12:32:32 -04:00
|
|
|
|
This part of the proposal had BDFL approval from the beginning.
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Relative Imports
|
|
|
|
|
==============================
|
|
|
|
|
|
|
|
|
|
With the shift to absolute imports, the question arose whether
|
|
|
|
|
relative imports should be allowed at all. Several use cases were
|
|
|
|
|
presented, the most important of which is being able to rearrange the
|
|
|
|
|
structure of large packages without having to edit sub-packages. In
|
|
|
|
|
addition, a module inside a package can't easily import itself without
|
|
|
|
|
relative imports.
|
|
|
|
|
|
|
|
|
|
Guido approved of the idea of relative imports, but there has been a
|
|
|
|
|
lot of disagreement on the spelling (syntax). There does seem to be
|
|
|
|
|
agreement that relative imports will require listing specific names to
|
|
|
|
|
import (that is, ``import foo`` as a bare term will always be an
|
|
|
|
|
absolute import).
|
|
|
|
|
|
|
|
|
|
Here are the contenders:
|
|
|
|
|
|
|
|
|
|
* One from Guido::
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
from .foo import bar
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
and ::
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
from ...foo import bar
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
These two forms have a couple of different suggested semantics. One
|
|
|
|
|
semantic is to make each dot represent one level. There have been
|
|
|
|
|
many complaints about the difficulty of counting dots. Another
|
|
|
|
|
option is to only allow one level of relative import. That misses a
|
|
|
|
|
lot of functionality, and people still complained about missing the
|
|
|
|
|
dot in the one-dot form. The final option is to define an algorithm
|
|
|
|
|
for finding relative modules and packages; the objection here is
|
|
|
|
|
"Explicit is better than implicit". (The algorithm proposed is
|
|
|
|
|
"search up from current package directory until the ultimate package
|
|
|
|
|
parent gets hit".)
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
Some people have suggested other punctuation as the separator, such
|
|
|
|
|
as "-" or "^".
|
|
|
|
|
|
|
|
|
|
Some people have suggested using "*"::
|
|
|
|
|
|
|
|
|
|
from *.foo import bar
|
|
|
|
|
|
2004-01-31 00:14:16 -05:00
|
|
|
|
* The next set of options is conflated from several posters::
|
|
|
|
|
|
|
|
|
|
from __pkg__.__pkg__ import
|
|
|
|
|
|
|
|
|
|
and ::
|
|
|
|
|
|
|
|
|
|
from .__parent__.__parent__ import
|
|
|
|
|
|
|
|
|
|
Many people (Guido included) think these look ugly, but they *are*
|
|
|
|
|
clear and explicit. Overall, more people prefer ``__pkg__`` as the
|
|
|
|
|
shorter option.
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
* One suggestion was to allow only sibling references. In other words,
|
|
|
|
|
you would not be able to use relative imports to refer to modules
|
|
|
|
|
higher in the package tree. You would then be able to do either ::
|
|
|
|
|
|
|
|
|
|
from .spam import eggs
|
|
|
|
|
|
|
|
|
|
or ::
|
|
|
|
|
|
|
|
|
|
import .spam.eggs
|
|
|
|
|
|
|
|
|
|
* Some people favor allowing indexed parents::
|
|
|
|
|
|
|
|
|
|
from -2.spam import eggs
|
|
|
|
|
|
|
|
|
|
In this scenario, importing from the current directory would be a
|
|
|
|
|
simple ::
|
|
|
|
|
|
|
|
|
|
from .spam import eggs
|
|
|
|
|
|
|
|
|
|
|
2004-01-31 00:14:16 -05:00
|
|
|
|
* Finally, some people dislike the way you have to change ``import``
|
|
|
|
|
to ``from ... import`` when you want to dig inside a package. They
|
|
|
|
|
suggest completely rewriting the ``import`` syntax::
|
|
|
|
|
|
|
|
|
|
from MODULE import NAMES as RENAME searching HOW
|
|
|
|
|
|
|
|
|
|
or ::
|
|
|
|
|
|
|
|
|
|
import NAMES as RENAME from MODULE searching HOW
|
|
|
|
|
[from NAMES] [in WHERE] import ...
|
|
|
|
|
|
2006-02-18 22:29:42 -05:00
|
|
|
|
However, this most likely could not be implemented for Python 2.5
|
2004-01-31 00:14:16 -05:00
|
|
|
|
(too big a change), and allowing relative imports is sufficiently
|
|
|
|
|
critical that we need something now (given that the standard
|
|
|
|
|
``import`` will change to absolute import). More than that, this
|
|
|
|
|
proposed syntax has several open questions:
|
|
|
|
|
|
|
|
|
|
- What is the precise proposed syntax? (Which clauses are optional
|
|
|
|
|
under which circumstances?)
|
|
|
|
|
|
|
|
|
|
- How strongly does the ``searching`` clause bind? In other words,
|
|
|
|
|
do you write::
|
|
|
|
|
|
|
|
|
|
import foo as bar searching XXX, spam as ham searching XXX
|
|
|
|
|
|
|
|
|
|
or::
|
|
|
|
|
|
|
|
|
|
import foo as bar, spam as ham searching XXX
|
|
|
|
|
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
Guido's Decision
|
2004-05-02 12:32:32 -04:00
|
|
|
|
================
|
|
|
|
|
|
|
|
|
|
Guido has Pronounced [1]_ that relative imports will use leading dots.
|
|
|
|
|
A single leading dot indicates a relative import, starting with the
|
|
|
|
|
current package. Two or more leading dots give a relative import to the
|
|
|
|
|
parent(s) of the current package, one level per dot after the first.
|
|
|
|
|
Here's a sample package layout::
|
|
|
|
|
|
|
|
|
|
package/
|
|
|
|
|
__init__.py
|
|
|
|
|
subpackage1/
|
|
|
|
|
__init__.py
|
|
|
|
|
moduleX.py
|
|
|
|
|
moduleY.py
|
|
|
|
|
subpackage2/
|
|
|
|
|
__init__.py
|
|
|
|
|
moduleZ.py
|
|
|
|
|
moduleA.py
|
|
|
|
|
|
|
|
|
|
Assuming that the current file is either ``moduleX.py`` or
|
|
|
|
|
``subpackage1/__init__.py``, following are correct usages of the new
|
|
|
|
|
syntax::
|
2004-04-03 21:37:57 -05:00
|
|
|
|
|
|
|
|
|
from .moduleY import spam
|
|
|
|
|
from .moduleY import spam as ham
|
|
|
|
|
from . import moduleY
|
|
|
|
|
from ..subpackage1 import moduleY
|
|
|
|
|
from ..subpackage2.moduleZ import eggs
|
|
|
|
|
from ..moduleA import foo
|
|
|
|
|
from ...package import bar
|
|
|
|
|
from ...sys import path
|
|
|
|
|
|
|
|
|
|
Note that while that last case is legal, it is certainly discouraged
|
|
|
|
|
("insane" was the word Guido used).
|
|
|
|
|
|
2004-05-02 12:32:32 -04:00
|
|
|
|
Relative imports must always use ``from <> import``; ``import <>`` is
|
|
|
|
|
always absolute. Of course, absolute imports can use ``from <> import``
|
|
|
|
|
by omitting the leading dots. The reason ``import .foo`` is prohibited
|
|
|
|
|
is because after ::
|
|
|
|
|
|
|
|
|
|
import XXX.YYY.ZZZ
|
|
|
|
|
|
|
|
|
|
then ::
|
|
|
|
|
|
|
|
|
|
XXX.YYY.ZZZ
|
|
|
|
|
|
|
|
|
|
is usable in an expression. But ::
|
|
|
|
|
|
|
|
|
|
.moduleY
|
|
|
|
|
|
|
|
|
|
is not usable in an expression.
|
|
|
|
|
|
2004-04-03 21:37:57 -05:00
|
|
|
|
|
2006-06-27 08:27:50 -04:00
|
|
|
|
Relative Imports and __name__
|
2007-02-17 13:42:37 -05:00
|
|
|
|
=============================
|
2006-06-27 08:27:50 -04:00
|
|
|
|
|
|
|
|
|
Relative imports use a module's __name__ attribute to determine that
|
|
|
|
|
module's position in the package hierarchy. If the module's name does
|
|
|
|
|
not contain any package information (e.g. it is set to '__main__')
|
|
|
|
|
then relative imports are resolved as if the module were a top level
|
|
|
|
|
module, regardless of where the module is actually located on the file
|
|
|
|
|
system.
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
|
2007-04-29 20:55:35 -04:00
|
|
|
|
Relative Imports and Indirection Entries in sys.modules
|
|
|
|
|
=======================================================
|
|
|
|
|
|
|
|
|
|
When packages were introduced, the concept of an indirection entry in
|
|
|
|
|
sys.modules came into existence [2]_. When an entry in sys.modules
|
|
|
|
|
for a module within a package had a value of None, it represented that
|
|
|
|
|
the module actually referenced the top-level module. For instance,
|
|
|
|
|
'Sound.Effects.string' might have a value of None in sys.modules.
|
|
|
|
|
That meant any import that resolved to that name actually was to
|
|
|
|
|
import the top-level 'string' module.
|
|
|
|
|
|
|
|
|
|
This introduced an optimization for when a relative import was meant
|
|
|
|
|
to resolve to an absolute import. But since this PEP makes a very
|
|
|
|
|
clear delineation between absolute and relative imports, this
|
|
|
|
|
optimization is no longer needed. When absolute/relative imports
|
|
|
|
|
become the only import semantics available then indirection entries in
|
|
|
|
|
sys.modules will no longer be supported.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2004-01-31 00:14:16 -05:00
|
|
|
|
References
|
|
|
|
|
==========
|
|
|
|
|
|
|
|
|
|
For more background, see the following python-dev threads:
|
|
|
|
|
|
|
|
|
|
- `Re: Christmas Wishlist
|
|
|
|
|
<http://mail.python.org/pipermail/python-dev/2003-December/040973.html>`__
|
|
|
|
|
|
|
|
|
|
- `Re: Python-Dev Digest, Vol 5, Issue 57
|
|
|
|
|
<http://mail.python.org/pipermail/python-dev/2003-December/041078.html>`__
|
|
|
|
|
|
|
|
|
|
- `Relative import
|
|
|
|
|
<http://mail.python.org/pipermail/python-dev/2003-December/041065.html>`__
|
|
|
|
|
|
|
|
|
|
- `Another Strategy for Relative Import
|
|
|
|
|
<http://mail.python.org/pipermail/python-dev/2003-December/041418.html>`__
|
|
|
|
|
|
2004-04-03 10:02:46 -05:00
|
|
|
|
.. [1] http://mail.python.org/pipermail/python-dev/2004-March/043739.html
|
|
|
|
|
|
2007-04-29 20:55:35 -04:00
|
|
|
|
.. [2] http://www.python.org/doc/essays/packages.html
|
|
|
|
|
|
2004-01-31 00:14:16 -05:00
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
=========
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
..
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
sentence-end-double-space: t
|
|
|
|
|
fill-column: 70
|
|
|
|
|
End:
|