mirror of https://github.com/python/cpython
When referring to namespaces, always say "namespaces" instead of
"name spaces". Inconsistency noted by Keith Briggs <keith.briggs@bt.com>.
This commit is contained in:
parent
81cccb7563
commit
1349437e4c
|
@ -480,9 +480,9 @@ in \code{cmp_op[\var{opname}]}.
|
||||||
|
|
||||||
\begin{opcodedesc}{IMPORT_NAME}{namei}
|
\begin{opcodedesc}{IMPORT_NAME}{namei}
|
||||||
Imports the module \code{co_names[\var{namei}]}. The module object is
|
Imports the module \code{co_names[\var{namei}]}. The module object is
|
||||||
pushed onto the stack. The current name space is not affected: for a
|
pushed onto the stack. The current namespace is not affected: for a
|
||||||
proper import statement, a subsequent \code{STORE_FAST} instruction
|
proper import statement, a subsequent \code{STORE_FAST} instruction
|
||||||
modifies the name space.
|
modifies the namespace.
|
||||||
\end{opcodedesc}
|
\end{opcodedesc}
|
||||||
|
|
||||||
\begin{opcodedesc}{IMPORT_FROM}{namei}
|
\begin{opcodedesc}{IMPORT_FROM}{namei}
|
||||||
|
|
|
@ -227,7 +227,7 @@ class instances are callable if they have a \method{__call__()} method.
|
||||||
The arguments are a file name and two optional dictionaries. The
|
The arguments are a file name and two optional dictionaries. The
|
||||||
file is parsed and evaluated as a sequence of Python statements
|
file is parsed and evaluated as a sequence of Python statements
|
||||||
(similarly to a module) using the \var{globals} and \var{locals}
|
(similarly to a module) using the \var{globals} and \var{locals}
|
||||||
dictionaries as global and local name space. If the \var{locals}
|
dictionaries as global and local namespace. If the \var{locals}
|
||||||
dictionary is omitted it defaults to the \var{globals} dictionary.
|
dictionary is omitted it defaults to the \var{globals} dictionary.
|
||||||
If both dictionaries are omitted, the expression is executed in the
|
If both dictionaries are omitted, the expression is executed in the
|
||||||
environment where \function{execfile()} is called. The return value is
|
environment where \function{execfile()} is called. The return value is
|
||||||
|
|
|
@ -888,7 +888,7 @@ different object types.
|
||||||
The implementation adds two special read-only attributes:
|
The implementation adds two special read-only attributes:
|
||||||
\code{\var{f}.func_code} is a function's \dfn{code
|
\code{\var{f}.func_code} is a function's \dfn{code
|
||||||
object}\obindex{code} (see below) and \code{\var{f}.func_globals} is
|
object}\obindex{code} (see below) and \code{\var{f}.func_globals} is
|
||||||
the dictionary used as the function's global name space (this is the
|
the dictionary used as the function's global namespace (this is the
|
||||||
same as \code{\var{m}.__dict__} where \var{m} is the module in which
|
same as \code{\var{m}.__dict__} where \var{m} is the module in which
|
||||||
the function \var{f} was defined).
|
the function \var{f} was defined).
|
||||||
|
|
||||||
|
|
|
@ -317,7 +317,7 @@ commands. This is similar to the \file{.profile} feature of the
|
||||||
This file is only read in interactive sessions, not when Python reads
|
This file is only read in interactive sessions, not when Python reads
|
||||||
commands from a script, and not when \file{/dev/tty} is given as the
|
commands from a script, and not when \file{/dev/tty} is given as the
|
||||||
explicit source of commands (which otherwise behaves like an
|
explicit source of commands (which otherwise behaves like an
|
||||||
interactive session). It is executed in the same name space where
|
interactive session). It is executed in the same namespace where
|
||||||
interactive commands are executed, so that objects that it defines or
|
interactive commands are executed, so that objects that it defines or
|
||||||
imports can be used without qualification in the interactive session.
|
imports can be used without qualification in the interactive session.
|
||||||
You can also change the prompts \code{sys.ps1} and \code{sys.ps2} in
|
You can also change the prompts \code{sys.ps1} and \code{sys.ps2} in
|
||||||
|
@ -3236,24 +3236,24 @@ Pascal.
|
||||||
|
|
||||||
Before introducing classes, I first have to tell you something about
|
Before introducing classes, I first have to tell you something about
|
||||||
Python's scope rules. Class definitions play some neat tricks with
|
Python's scope rules. Class definitions play some neat tricks with
|
||||||
name spaces, and you need to know how scopes and name spaces work to
|
namespaces, and you need to know how scopes and namespaces work to
|
||||||
fully understand what's going on. Incidentally, knowledge about this
|
fully understand what's going on. Incidentally, knowledge about this
|
||||||
subject is useful for any advanced Python programmer.
|
subject is useful for any advanced Python programmer.
|
||||||
|
|
||||||
Let's begin with some definitions.
|
Let's begin with some definitions.
|
||||||
|
|
||||||
A \emph{name space} is a mapping from names to objects. Most name
|
A \emph{namespace} is a mapping from names to objects. Most
|
||||||
spaces are currently implemented as Python dictionaries, but that's
|
namespaces are currently implemented as Python dictionaries, but
|
||||||
normally not noticeable in any way (except for performance), and it
|
that's normally not noticeable in any way (except for performance),
|
||||||
may change in the future. Examples of name spaces are: the set of
|
and it may change in the future. Examples of namespaces are: the set
|
||||||
built-in names (functions such as \function{abs()}, and built-in exception
|
of built-in names (functions such as \function{abs()}, and built-in
|
||||||
names); the global names in a module; and the local names in a
|
exception names); the global names in a module; and the local names in
|
||||||
function invocation. In a sense the set of attributes of an object
|
a function invocation. In a sense the set of attributes of an object
|
||||||
also form a name space. The important thing to know about name
|
also form a namespace. The important thing to know about namespaces
|
||||||
spaces is that there is absolutely no relation between names in
|
is that there is absolutely no relation between names in different
|
||||||
different name spaces; for instance, two different modules may both
|
namespaces; for instance, two different modules may both define a
|
||||||
define a function ``maximize'' without confusion --- users of the
|
function ``maximize'' without confusion --- users of the modules must
|
||||||
modules must prefix it with the module name.
|
prefix it with the module name.
|
||||||
|
|
||||||
By the way, I use the word \emph{attribute} for any name following a
|
By the way, I use the word \emph{attribute} for any name following a
|
||||||
dot --- for example, in the expression \code{z.real}, \code{real} is
|
dot --- for example, in the expression \code{z.real}, \code{real} is
|
||||||
|
@ -3262,13 +3262,13 @@ names in modules are attribute references: in the expression
|
||||||
\code{modname.funcname}, \code{modname} is a module object and
|
\code{modname.funcname}, \code{modname} is a module object and
|
||||||
\code{funcname} is an attribute of it. In this case there happens to
|
\code{funcname} is an attribute of it. In this case there happens to
|
||||||
be a straightforward mapping between the module's attributes and the
|
be a straightforward mapping between the module's attributes and the
|
||||||
global names defined in the module: they share the same name
|
global names defined in the module: they share the same namespace!
|
||||||
space!\footnote{
|
\footnote{
|
||||||
Except for one thing. Module objects have a secret read-only
|
Except for one thing. Module objects have a secret read-only
|
||||||
attribute called \code{__dict__} which returns the dictionary
|
attribute called \member{__dict__} which returns the dictionary
|
||||||
used to implement the module's name space; the name
|
used to implement the module's namespace; the name
|
||||||
\code{__dict__} is an attribute but not a global name.
|
\member{__dict__} is an attribute but not a global name.
|
||||||
Obviously, using this violates the abstraction of name space
|
Obviously, using this violates the abstraction of namespace
|
||||||
implementation, and should be restricted to things like
|
implementation, and should be restricted to things like
|
||||||
post-mortem debuggers.
|
post-mortem debuggers.
|
||||||
}
|
}
|
||||||
|
@ -3280,54 +3280,54 @@ also be deleted with the \keyword{del} statement, e.g.
|
||||||
\samp{del modname.the_answer}.
|
\samp{del modname.the_answer}.
|
||||||
|
|
||||||
Name spaces are created at different moments and have different
|
Name spaces are created at different moments and have different
|
||||||
lifetimes. The name space containing the built-in names is created
|
lifetimes. The namespace containing the built-in names is created
|
||||||
when the Python interpreter starts up, and is never deleted. The
|
when the Python interpreter starts up, and is never deleted. The
|
||||||
global name space for a module is created when the module definition
|
global namespace for a module is created when the module definition
|
||||||
is read in; normally, module name spaces also last until the
|
is read in; normally, module namespaces also last until the
|
||||||
interpreter quits. The statements executed by the top-level
|
interpreter quits. The statements executed by the top-level
|
||||||
invocation of the interpreter, either read from a script file or
|
invocation of the interpreter, either read from a script file or
|
||||||
interactively, are considered part of a module called
|
interactively, are considered part of a module called
|
||||||
\module{__main__}, so they have their own global name space. (The
|
\module{__main__}, so they have their own global namespace. (The
|
||||||
built-in names actually also live in a module; this is called
|
built-in names actually also live in a module; this is called
|
||||||
\module{__builtin__}.)
|
\module{__builtin__}.)
|
||||||
|
|
||||||
The local name space for a function is created when the function is
|
The local namespace for a function is created when the function is
|
||||||
called, and deleted when the function returns or raises an exception
|
called, and deleted when the function returns or raises an exception
|
||||||
that is not handled within the function. (Actually, forgetting would
|
that is not handled within the function. (Actually, forgetting would
|
||||||
be a better way to describe what actually happens.) Of course,
|
be a better way to describe what actually happens.) Of course,
|
||||||
recursive invocations each have their own local name space.
|
recursive invocations each have their own local namespace.
|
||||||
|
|
||||||
A \emph{scope} is a textual region of a Python program where a name space
|
A \emph{scope} is a textual region of a Python program where a
|
||||||
is directly accessible. ``Directly accessible'' here means that an
|
namespace is directly accessible. ``Directly accessible'' here means
|
||||||
unqualified reference to a name attempts to find the name in the name
|
that an unqualified reference to a name attempts to find the name in
|
||||||
space.
|
the namespace.
|
||||||
|
|
||||||
Although scopes are determined statically, they are used dynamically.
|
Although scopes are determined statically, they are used dynamically.
|
||||||
At any time during execution, exactly three nested scopes are in use
|
At any time during execution, exactly three nested scopes are in use
|
||||||
(i.e., exactly three name spaces are directly accessible): the
|
(i.e., exactly three namespaces are directly accessible): the
|
||||||
innermost scope, which is searched first, contains the local names,
|
innermost scope, which is searched first, contains the local names,
|
||||||
the middle scope, searched next, contains the current module's global
|
the middle scope, searched next, contains the current module's global
|
||||||
names, and the outermost scope (searched last) is the name space
|
names, and the outermost scope (searched last) is the namespace
|
||||||
containing built-in names.
|
containing built-in names.
|
||||||
|
|
||||||
Usually, the local scope references the local names of the (textually)
|
Usually, the local scope references the local names of the (textually)
|
||||||
current function. Outside of functions, the local scope references
|
current function. Outside of functions, the local scope references
|
||||||
the same name space as the global scope: the module's name space.
|
the same namespace as the global scope: the module's namespace.
|
||||||
Class definitions place yet another name space in the local scope.
|
Class definitions place yet another namespace in the local scope.
|
||||||
|
|
||||||
It is important to realize that scopes are determined textually: the
|
It is important to realize that scopes are determined textually: the
|
||||||
global scope of a function defined in a module is that module's name
|
global scope of a function defined in a module is that module's
|
||||||
space, no matter from where or by what alias the function is called.
|
namespace, no matter from where or by what alias the function is
|
||||||
On the other hand, the actual search for names is done dynamically, at
|
called. On the other hand, the actual search for names is done
|
||||||
run time --- however, the language definition is evolving towards
|
dynamically, at run time --- however, the language definition is
|
||||||
static name resolution, at ``compile'' time, so don't rely on dynamic
|
evolving towards static name resolution, at ``compile'' time, so don't
|
||||||
name resolution! (In fact, local variables are already determined
|
rely on dynamic name resolution! (In fact, local variables are
|
||||||
statically.)
|
already determined statically.)
|
||||||
|
|
||||||
A special quirk of Python is that assignments always go into the
|
A special quirk of Python is that assignments always go into the
|
||||||
innermost scope. Assignments do not copy data --- they just
|
innermost scope. Assignments do not copy data --- they just
|
||||||
bind names to objects. The same is true for deletions: the statement
|
bind names to objects. The same is true for deletions: the statement
|
||||||
\samp{del x} removes the binding of \code{x} from the name space
|
\samp{del x} removes the binding of \code{x} from the namespace
|
||||||
referenced by the local scope. In fact, all operations that introduce
|
referenced by the local scope. In fact, all operations that introduce
|
||||||
new names use the local scope: in particular, import statements and
|
new names use the local scope: in particular, import statements and
|
||||||
function definitions bind the module or function name in the local
|
function definitions bind the module or function name in the local
|
||||||
|
@ -3366,14 +3366,14 @@ inside a class normally have a peculiar form of argument list,
|
||||||
dictated by the calling conventions for methods --- again, this is
|
dictated by the calling conventions for methods --- again, this is
|
||||||
explained later.
|
explained later.
|
||||||
|
|
||||||
When a class definition is entered, a new name space is created, and
|
When a class definition is entered, a new namespace is created, and
|
||||||
used as the local scope --- thus, all assignments to local variables
|
used as the local scope --- thus, all assignments to local variables
|
||||||
go into this new name space. In particular, function definitions bind
|
go into this new namespace. In particular, function definitions bind
|
||||||
the name of the new function here.
|
the name of the new function here.
|
||||||
|
|
||||||
When a class definition is left normally (via the end), a \emph{class
|
When a class definition is left normally (via the end), a \emph{class
|
||||||
object} is created. This is basically a wrapper around the contents
|
object} is created. This is basically a wrapper around the contents
|
||||||
of the name space created by the class definition; we'll learn more
|
of the namespace created by the class definition; we'll learn more
|
||||||
about class objects in the next section. The original local scope
|
about class objects in the next section. The original local scope
|
||||||
(the one in effect just before the class definitions was entered) is
|
(the one in effect just before the class definitions was entered) is
|
||||||
reinstated, and the class object is bound here to the class name given
|
reinstated, and the class object is bound here to the class name given
|
||||||
|
@ -3387,7 +3387,7 @@ and instantiation.
|
||||||
|
|
||||||
\emph{Attribute references} use the standard syntax used for all
|
\emph{Attribute references} use the standard syntax used for all
|
||||||
attribute references in Python: \code{obj.name}. Valid attribute
|
attribute references in Python: \code{obj.name}. Valid attribute
|
||||||
names are all the names that were in the class's name space when the
|
names are all the names that were in the class's namespace when the
|
||||||
class object was created. So, if the class definition looked like
|
class object was created. So, if the class definition looked like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
|
@ -3766,9 +3766,10 @@ code that is byte-compiled together. The same restriction applies to
|
||||||
when referencing \code{__dict__} directly.
|
when referencing \code{__dict__} directly.
|
||||||
|
|
||||||
Here's an example of a class that implements its own
|
Here's an example of a class that implements its own
|
||||||
\code{__getattr__} and \code{__setattr__} methods and stores all
|
\method{__getattr__()} and \method{__setattr__()} methods and stores
|
||||||
attributes in a private variable, in a way that works in Python 1.4 as
|
all attributes in a private variable, in a way that works in all
|
||||||
well as in previous versions:
|
versions of Python, including those available before this feature was
|
||||||
|
added:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
class VirtualAttributes:
|
class VirtualAttributes:
|
||||||
|
|
Loading…
Reference in New Issue