Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
624f3372
Commit
624f3372
authored
Mar 31, 2009
by
Georg Brandl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#5529: backport new docs of import semantics written by Brett to 2.x.
parent
21b60afd
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
177 additions
and
52 deletions
+177
-52
Doc/glossary.rst
Doc/glossary.rst
+14
-0
Doc/library/sys.rst
Doc/library/sys.rst
+37
-0
Doc/reference/simple_stmts.rst
Doc/reference/simple_stmts.rst
+126
-52
No files found.
Doc/glossary.rst
View file @
624f3372
...
...
@@ -185,6 +185,11 @@ Glossary
A module written in C or C++, using Python's C API to interact with the core and
with user code.
finder
An object that tries to find the :term:`loader` for a module. It must
implement a method named :meth:`find_module`. See :pep:`302` for
details.
function
A series of statements which returns some value to a caller. It can also
be passed zero or more arguments which may be used in the execution of
...
...
@@ -288,6 +293,10 @@ Glossary
fraction. Integer division can be forced by using the ``//`` operator
instead of the ``/`` operator. See also :term:`__future__`.
importer
An object that both finds and loads a module; both a
:term:`finder` and :term:`loader` object.
interactive
Python has an interactive interpreter which means you can enter
statements and expressions at the interpreter prompt, immediately
...
...
@@ -368,6 +377,11 @@ Glossary
clause is optional. If omitted, all elements in ``range(256)`` are
processed.
loader
An object that loads a module. It must define a method named
:meth:`load_module`. A loader is typically returned by a
:term:`finder`. See :pep:`302` for details.
mapping
A container object (such as :class:`dict`) which supports arbitrary key
lookups using the special method :meth:`__getitem__`.
...
...
Doc/library/sys.rst
View file @
624f3372
...
...
@@ -554,6 +554,22 @@ always available.
characters are stored as UCS-2 or UCS-4.
.. data:: meta_path
A list of :term:`finder` objects that have their :meth:`find_module`
methods called to see if one of the objects can find the module to be
imported. The :meth:`find_module` method is called at least with the
absolute name of the module being imported. If the module to be imported is
contained in package then the parent package's :attr:`__path__` attribute
is passed in as a second argument. The method returns :keyword:`None` if
the module cannot be found, else returns a :term:`loader`.
:data:`sys.meta_path` is searched before any implicit default finders or
:data:`sys.path`.
See :pep:`302` for the original specification.
.. data:: modules
.. index:: builtin: reload
...
...
@@ -590,6 +606,27 @@ always available.
:data:`sys.path`.
.. data:: path_hooks
A list of callables that take a path argument to try to create a
:term:`finder` for the path. If a finder can be created, it is to be
returned by the callable, else raise :exc:`ImportError`.
Originally specified in :pep:`302`.
.. data:: path_importer_cache
A dictionary acting as a cache for :term:`finder` objects. The keys are
paths that have been passed to :data:`sys.path_hooks` and the values are
the finders that are found. If a path is a valid file system path but no
explicit finder is found on :data:`sys.path_hooks` then :keyword:`None` is
stored to represent the implicit default finder should be used. If the path
is not an existing path then :class:`imp.NullImporter` is set.
Originally specified in :pep:`302`.
.. data:: platform
This string contains a platform identifier that can be used to append
...
...
Doc/reference/simple_stmts.rst
View file @
624f3372
...
...
@@ -653,48 +653,124 @@ The :keyword:`import` statement
Import
statements
are
executed
in
two
steps
:
(
1
)
find
a
module
,
and
initialize
it
if
necessary
;
(
2
)
define
a
name
or
names
in
the
local
namespace
(
of
the
scope
where the :keyword:`import` statement occurs). The first form (without
:keyword:`from`) repeats these steps for each identifier in the list. The form
with :keyword:`from` performs step (1) once, and then performs step (2)
repeatedly.
where
the
:
keyword
:`
import
`
statement
occurs
).
The
statement
comes
in
two
forms
differing
on
whether
it
uses
the
:
keyword
:`
from
`
keyword
.
The
first
form
(
without
:
keyword
:`
from
`)
repeats
these
steps
for
each
identifier
in
the
list
.
The
form
with
:
keyword
:`
from
`
performs
step
(
1
)
once
,
and
then
performs
step
(
2
)
repeatedly
.
In this context, to "initialize" a built-in or extension module means to call an
initialization function that the module must provide for the purpose (in the
reference implementation, the function's name is obtained by prepending string
"init" to the module's name); to "initialize" a Python-coded module means to
execute the module's body.
..
index
::
single
:
package
To
understand
how
step
(
1
)
occurs
,
one
must
first
understand
how
Python
handles
hierarchical
naming
of
modules
.
To
help
organize
modules
and
provide
a
hierarchy
in
naming
,
Python
has
a
concept
of
packages
.
A
package
can
contain
other
packages
and
modules
while
modules
cannot
contain
other
modules
or
packages
.
From
a
file
system
perspective
,
packages
are
directories
and
modules
are
files
.
The
original
`
specification
for
packages
<
http
://
www
.
python
.
org
/
doc
/
essays
/
packages
.
html
>`
_
is
still
available
to
read
,
although
minor
details
have
changed
since
the
writing
of
that
document
.
..
index
::
single: modules (in module sys)
single: sys.modules
pair: module; name
pair: built-in; module
pair: user-defined; module
module: sys
pair: filename; extension
triple: module; search; path
single
:
sys
.
modules
The system maintains a table of modules that have been or are being initialized,
indexed by module name. This table is accessible as ``sys.modules``. When a
module name is found in this table, step (1) is finished. If not, a search for
a module definition is started. When a module is found, it is loaded. Details
of the module searching and loading process are implementation and platform
specific. It generally involves searching for a "built-in" module with the
given name and then searching a list of locations given as ``sys.path``.
Once
the
name
of
the
module
is
known
(
unless
otherwise
specified
,
the
term
"module"
will
refer
to
both
packages
and
modules
),
searching
for
the
module
or
package
can
begin
.
The
first
place
checked
is
:
data
:`
sys
.
modules
`,
the
cache
of
all
modules
that
have
been
imported
previously
.
If
the
module
is
found
there
then
it
is
used
in
step
(
2
)
of
import
.
..
index
::
pair: module; initialization
exception: ImportError
single: code block
exception: SyntaxError
single
:
sys
.
meta_path
single
:
finder
pair
:
finder
;
find_module
single
:
__path__
If
the
module
is
not
found
in
the
cache
,
then
:
data
:`
sys
.
meta_path
`
is
searched
(
the
specification
for
:
data
:`
sys
.
meta_path
`
can
be
found
in
:
pep
:`
302
`).
The
object
is
a
list
of
:
term
:`
finder
`
objects
which
are
queried
in
order
as
to
whether
they
know
how
to
load
the
module
by
calling
their
:
meth
:`
find_module
`
method
with
the
name
of
the
module
.
If
the
module
happens
to
be
contained
within
a
package
(
as
denoted
by
the
existence
of
a
dot
in
the
name
),
then
a
second
argument
to
:
meth
:`
find_module
`
is
given
as
the
value
of
the
:
attr
:`
__path__
`
attribute
from
the
parent
package
(
everything
up
to
the
last
dot
in
the
name
of
the
module
being
imported
).
If
a
finder
can
find
the
module
it
returns
a
:
term
:`
loader
`
(
discussed
later
)
or
returns
:
keyword
:`
None
`.
..
index
::
single
:
sys
.
path_hooks
single
:
sys
.
path_importer_cache
single
:
sys
.
path
If
none
of
the
finders
on
:
data
:`
sys
.
meta_path
`
are
able
to
find
the
module
then
some
implicitly
defined
finders
are
queried
.
Implementations
of
Python
vary
in
what
implicit
meta
path
finders
are
defined
.
The
one
they
all
do
define
,
though
,
is
one
that
handles
:
data
:`
sys
.
path_hooks
`,
:
data
:`
sys
.
path_importer_cache
`,
and
:
data
:`
sys
.
path
`.
The
implicit
finder
searches
for
the
requested
module
in
the
"paths"
specified
in
one
of
two
places
(
"paths"
do
not
have
to
be
file
system
paths
).
If
the
module
being
imported
is
supposed
to
be
contained
within
a
package
then
the
second
argument
passed
to
:
meth
:`
find_module
`,
:
attr
:`
__path__
`
on
the
parent
package
,
is
used
as
the
source
of
paths
.
If
the
module
is
not
contained
in
a
package
then
:
data
:`
sys
.
path
`
is
used
as
the
source
of
paths
.
Once
the
source
of
paths
is
chosen
it
is
iterated
over
to
find
a
finder
that
can
handle
that
path
.
The
dict
at
:
data
:`
sys
.
path_importer_cache
`
caches
finders
for
paths
and
is
checked
for
a
finder
.
If
the
path
does
not
have
a
finder
cached
then
:
data
:`
sys
.
path_hooks
`
is
searched
by
calling
each
object
in
the
list
with
a
single
argument
of
the
path
,
returning
a
finder
or
raises
:
exc
:`
ImportError
`.
If
a
finder
is
returned
then
it
is
cached
in
:
data
:`
sys
.
path_importer_cache
`
and
then
used
for
that
path
entry
.
If
no
finder
can
be
found
but
the
path
exists
then
a
value
of
:
keyword
:`
None
`
is
stored
in
:
data
:`
sys
.
path_importer_cache
`
to
signify
that
an
implicit
,
file
-
based
finder
that
handles
modules
stored
as
individual
files
should
be
used
for
that
path
.
If
the
path
does
not
exist
then
a
finder
which
always
returns
:
keyword
:`
None
`
is
placed
in
the
cache
for
the
path
.
..
index
::
single
:
loader
pair
:
loader
;
load_module
exception
:
ImportError
If
no
finder
can
find
the
module
then
:
exc
:`
ImportError
`
is
raised
.
Otherwise
some
finder
returned
a
loader
whose
:
meth
:`
load_module
`
method
is
called
with
the
name
of
the
module
to
load
(
see
:
pep
:`
302
`
for
the
original
definition
of
loaders
).
A
loader
has
several
responsibilities
to
perform
on
a
module
it
loads
.
First
,
if
the
module
already
exists
in
:
data
:`
sys
.
modules
`
(
a
possibility
if
the
loader
is
called
outside
of
the
import
machinery
)
then
it
is
to
use
that
module
for
initialization
and
not
a
new
module
.
But
if
the
module
does
not
exist
in
:
data
:`
sys
.
modules
`
then
it
is
to
be
added
to
that
dict
before
initialization
begins
.
If
an
error
occurs
during
loading
of
the
module
and
it
was
added
to
:
data
:`
sys
.
modules
`
it
is
to
be
removed
from
the
dict
.
If
an
error
occurs
but
the
module
was
already
in
:
data
:`
sys
.
modules
`
it
is
left
in
the
dict
.
..
index
::
single
:
__name__
single
:
__file__
single
:
__path__
single
:
__package__
single
:
__loader__
The
loader
must
set
several
attributes
on
the
module
.
:
data
:`
__name__
`
is
to
be
set
to
the
name
of
the
module
.
:
data
:`
__file__
`
is
to
be
the
"path"
to
the
file
unless
the
module
is
built
-
in
(
and
thus
listed
in
:
data
:`
sys
.
builtin_module_names
`)
in
which
case
the
attribute
is
not
set
.
If
what
is
being
imported
is
a
package
then
:
data
:`
__path__
`
is
to
be
set
to
a
list
of
paths
to
be
searched
when
looking
for
modules
and
packages
contained
within
the
package
being
imported
.
:
data
:`
__package__
`
is
optional
but
should
be
set
to
the
name
of
package
that
contains
the
module
or
package
(
the
empty
string
is
used
for
module
not
contained
in
a
package
).
:
data
:`
__loader__
`
is
also
optional
but
should
be
set
to
the
loader
object
that
is
loading
the
module
.
If a built-in module is found, its built-in initialization code is executed and
step (1) is finished. If no matching file is found, :exc:`ImportError` is
raised. If a file is found, it is parsed, yielding an executable code block. If
a syntax error occurs, :exc:`SyntaxError` is raised. Otherwise, an empty module
of the given name is created and inserted in the module table, and then the code
block is executed in the context of this module. Exceptions during this
execution terminate step (1).
..
index
::
exception
:
ImportError
If
an
error
occurs
during
loading
then
the
loader
raises
:
exc
:`
ImportError
`
if
some
other
exception
is
not
already
being
propagated
.
Otherwise
the
loader
returns
the
module
that
was
loaded
and
initialized
.
When
step
(
1
)
finishes
without
raising
an
exception
,
step
(
2
)
can
begin
.
...
...
@@ -734,23 +810,21 @@ function contains or is a nested block with free variables, the compiler will
raise
a
:
exc
:`
SyntaxError
`.
..
index
::
keyword: from
statement: from
triple: hierarchical; module; names
single: packages
single: __init__.py
**Hierarchical module names:** when the module names contains one or more dots,
the module search path is carried out differently. The sequence of identifiers
up to the last dot is used to find a "package"; the final identifier is then
searched inside the package. A package is generally a subdirectory of a
directory on ``sys.path`` that has a file :file:`__init__.py`.
..
[XXX Can't be
bothered to spell this out right now; see the URL
http://www.python.org/doc/essays/packages.html for more details, also about how
the module search works from inside a package.]
single
:
relative
;
import
When
specifying
what
module
to
import
you
do
not
have
to
specify
the
absolute
name
of
the
module
.
When
a
module
or
package
is
contained
within
another
package
it
is
possible
to
make
a
relative
import
within
the
same
top
package
without
having
to
mention
the
package
name
.
By
using
leading
dots
in
the
specified
module
or
package
after
:
keyword
:`
from
`
you
can
specify
how
high
to
traverse
up
the
current
package
hierarchy
without
specifying
exact
names
.
One
leading
dot
means
the
current
package
where
the
module
making
the
import
exists
.
Two
dots
means
up
one
package
level
.
Three
dots
is
up
two
levels
,
etc
.
So
if
you
execute
``
from
.
import
mod
``
from
a
module
in
the
``
pkg
``
package
then
you
will
end
up
importing
``
pkg
.
mod
``.
If
you
execute
``
from
..
subpkg2
imprt
mod
``
from
within
``
pkg
.
subpkg1
``
you
will
import
``
pkg
.
subpkg2
.
mod
``.
The
specification
for
relative
imports
is
contained
within
:
pep
:`
328
`.
..
index
::
builtin
:
__import__
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment