GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing peps.python.org — PEP 328 – Imports: Multi-Line and Absolute/Relative | peps.python.org
PEP 328 – Imports: Multi-Line and Absolute/Relative
PEP 328 – Imports: Multi-Line and Absolute/Relative
AbstractThe
For the first problem, it is proposed that parentheses be permitted to
enclose multiple names, thus allowing Python’s standard mechanisms for
multi-line values to apply. For the second problem, it is proposed that
all TimelineIn Python 2.5, you must enable the new absolute import behavior with from __future__ import absolute_import You may use relative imports freely. In Python 2.6, any Rationale for ParenthesesCurrently, if you want to import a lot of names from a module or package, you have to choose one of several unpalatable options:
( Instead, it should be possible to use Python’s standard grouping
mechanism (parentheses) to write the from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, RIDGE, END) This part of the proposal had BDFL approval from the beginning. Parentheses support was added to Python 2.4. Rationale for Absolute ImportsIn Python 2.4 and earlier, if you’re reading a module located inside a package, it is not clear whether import foo refers to a top-level module or to another module inside the package.
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 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. Because this represents a change in semantics, absolute imports will be optional in Python 2.5 and 2.6 through the use of from __future__ import absolute_import This part of the proposal had BDFL approval from the beginning. Rationale for Relative ImportsWith 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, Here are the contenders:
Guido’s DecisionGuido 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 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). Relative imports must always use import XXX.YYY.ZZZ then XXX.YYY.ZZZ is usable in an expression. But .moduleY is not usable in an expression. Relative Imports and __name__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. Relative Imports and Indirection Entries in sys.modulesWhen 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. ReferencesFor more background, see the following python-dev threads: CopyrightThis document has been placed in the public domain. |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |