[Python-3000-checkins] r58042 - in python/branches/py3k/Doc: library/exceptions.rst reference/compound_stmts.rst reference/expressions.rst reference/simple_stmts.rst reference/toplevel_components.rst

georg.brandl python-3000-checkins at python.org
Fri Sep 7 19:52:54 CEST 2007


Author: georg.brandl
Date: Fri Sep  7 19:52:53 2007
New Revision: 58042

Modified:
   python/branches/py3k/Doc/library/exceptions.rst
   python/branches/py3k/Doc/reference/compound_stmts.rst
   python/branches/py3k/Doc/reference/expressions.rst
   python/branches/py3k/Doc/reference/simple_stmts.rst
   python/branches/py3k/Doc/reference/toplevel_components.rst
Log:
Finish the first pass of the language reference update.
Document extended iterable unpacking, raising and catching exceptions, class decorators, etc.
A few notable things are not documented yet, I've added XXX comments about that.


Modified: python/branches/py3k/Doc/library/exceptions.rst
==============================================================================
--- python/branches/py3k/Doc/library/exceptions.rst	(original)
+++ python/branches/py3k/Doc/library/exceptions.rst	Fri Sep  7 19:52:53 2007
@@ -46,6 +46,7 @@
 
 The following exceptions are only used as base classes for other exceptions.
 
+.. XXX document with_traceback()
 
 .. exception:: BaseException
 

Modified: python/branches/py3k/Doc/reference/compound_stmts.rst
==============================================================================
--- python/branches/py3k/Doc/reference/compound_stmts.rst	(original)
+++ python/branches/py3k/Doc/reference/compound_stmts.rst	Fri Sep  7 19:52:53 2007
@@ -14,8 +14,10 @@
 
 The :keyword:`if`, :keyword:`while` and :keyword:`for` statements implement
 traditional control flow constructs.  :keyword:`try` specifies exception
-handlers and/or cleanup code for a group of statements.  Function and class
-definitions are also syntactically compound statements.
+handlers and/or cleanup code for a group of statements, while the
+:keyword:`with` statement allows the execution of initialization and
+finalization code around a block of code.  Function and class definitions are
+also syntactically compound statements.
 
 .. index::
    single: clause
@@ -30,7 +32,7 @@
 can be one or more indented statements on subsequent lines.  Only the latter
 form of suite can contain nested compound statements; the following is illegal,
 mostly because it wouldn't be clear to which :keyword:`if` clause a following
-:keyword:`else` clause would belong:   ::
+:keyword:`else` clause would belong::
 
    if test1: if test2: print(x)
 
@@ -60,7 +62,7 @@
    pair: dangling; else
 
 Note that statements always end in a ``NEWLINE`` possibly followed by a
-``DEDENT``. Also note that optional continuation clauses always begin with a
+``DEDENT``.  Also note that optional continuation clauses always begin with a
 keyword that cannot start a statement, thus there are no ambiguities (the
 'dangling :keyword:`else`' problem is solved in Python by requiring nested
 :keyword:`if` statements to be indented).
@@ -75,6 +77,8 @@
 ===========================
 
 .. index:: statement: if
+           keyword: elif
+           keyword: else
 
 The :keyword:`if` statement is used for conditional execution:
 
@@ -83,10 +87,6 @@
           : ( "elif" `expression` ":" `suite` )*
           : ["else" ":" `suite`]
 
-.. index::
-   keyword: elif
-   keyword: else
-
 It selects exactly one of the suites by evaluating the expressions one by one
 until one is found to be true (see section :ref:`booleans` for the definition of
 true and false); then that suite is executed (and no other part of the
@@ -101,6 +101,7 @@
 
 .. index::
    statement: while
+   keyword: else
    pair: loop; statement
 
 The :keyword:`while` statement is used for repeated execution as long as an
@@ -110,8 +111,6 @@
    while_stmt: "while" `expression` ":" `suite`
              : ["else" ":" `suite`]
 
-.. index:: keyword: else
-
 This repeatedly tests the expression and, if it is true, executes the first
 suite; if the expression is false (which may be the first time it is tested) the
 suite of the :keyword:`else` clause, if present, is executed and the loop
@@ -134,9 +133,11 @@
 
 .. index::
    statement: for
+   keyword: in
+   keyword: else
+   pair: target; list
    pair: loop; statement
-
-.. index:: object: sequence
+   object: sequence
 
 The :keyword:`for` statement is used to iterate over the elements of a sequence
 (such as a string, tuple or list) or other iterable object:
@@ -145,17 +146,13 @@
    for_stmt: "for" `target_list` "in" `expression_list` ":" `suite`
            : ["else" ":" `suite`]
 
-.. index::
-   keyword: in
-   keyword: else
-   pair: target; list
-
 The expression list is evaluated once; it should yield an iterable object.  An
 iterator is created for the result of the ``expression_list``.  The suite is
 then executed once for each item provided by the iterator, in the order of
 ascending indices.  Each item in turn is assigned to the target list using the
-standard rules for assignments, and then the suite is executed.  When the items
-are exhausted (which is immediately when the sequence is empty), the suite in
+standard rules for assignments (see :ref:`assignment`), and then the suite is
+executed.  When the items are exhausted (which is immediately when the sequence
+is empty or an iterator raises a :exc:`StopIteration` exception), the suite in
 the :keyword:`else` clause, if present, is executed, and the loop terminates.
 
 .. index::
@@ -173,13 +170,12 @@
 
 .. index::
    builtin: range
-   pair: Pascal; language
 
-The target list is not deleted when the loop is finished, but if the sequence is
-empty, it will not have been assigned to at all by the loop.  Hint: the built-in
-function :func:`range` returns a sequence of integers suitable to emulate the
-effect of Pascal's ``for i := a to b do``; e.g., ``range(3)`` returns the list
-``[0, 1, 2]``.
+Names in the target list are not deleted when the loop is finished, but if the
+sequence is empty, it will not have been assigned to at all by the loop.  Hint:
+the built-in function :func:`range` returns an iterator of integers suitable to
+emulate the effect of Pascal's ``for i := a to b do``; e.g., ``range(3)``
+returns the list ``[0, 1, 2]``.
 
 .. warning::
 
@@ -188,21 +184,19 @@
       single: mutable sequence; loop over
 
    There is a subtlety when the sequence is being modified by the loop (this can
-   only occur for mutable sequences, i.e. lists). An internal counter is used to
-   keep track of which item is used next, and this is incremented on each
+   only occur for mutable sequences, i.e. lists).  An internal counter is used
+   to keep track of which item is used next, and this is incremented on each
    iteration.  When this counter has reached the length of the sequence the loop
    terminates.  This means that if the suite deletes the current (or a previous)
-   item from the sequence, the next item will be skipped (since it gets the index
-   of the current item which has already been treated).  Likewise, if the suite
-   inserts an item in the sequence before the current item, the current item will
-   be treated again the next time through the loop. This can lead to nasty bugs
-   that can be avoided by making a temporary copy using a slice of the whole
-   sequence, e.g.,
-
-::
+   item from the sequence, the next item will be skipped (since it gets the
+   index of the current item which has already been treated).  Likewise, if the
+   suite inserts an item in the sequence before the current item, the current
+   item will be treated again the next time through the loop. This can lead to
+   nasty bugs that can be avoided by making a temporary copy using a slice of
+   the whole sequence, e.g., ::
 
-   for x in a[:]:
-       if x < 0: a.remove(x)
+      for x in a[:]:
+          if x < 0: a.remove(x)
 
 
 .. _try:
@@ -245,12 +239,33 @@
 as if the entire :keyword:`try` statement raised the exception).
 
 When a matching except clause is found, the exception is assigned to the target
-specified after the ``as`` keyword in that except clause, if present, and the
-except clause's suite is executed.  All except clauses must have an executable
-block.  When the end of this block is reached, execution continues normally
-after the entire try statement.  (This means that if two nested handlers exist
-for the same exception, and the exception occurs in the try clause of the inner
-handler, the outer handler will not handle the exception.)
+specified after the :keyword:`as` keyword in that except clause, if present, and
+the except clause's suite is executed.  All except clauses must have an
+executable block.  When the end of this block is reached, execution continues
+normally after the entire try statement.  (This means that if two nested
+handlers exist for the same exception, and the exception occurs in the try
+clause of the inner handler, the outer handler will not handle the exception.)
+
+When an exception has been assigned using ``as target``, it is cleared at the
+end of the except clause.  This is as if ::
+
+   except E as N:
+       foo
+
+was translated to ::
+
+   except E as N:
+       try:
+           foo
+       finally:
+           N = None
+           del N
+
+That means that you have to assign the exception to a different name if you want
+to be able to refer to it after the except clause.  The reason for this is that
+with the traceback attached to them, exceptions will form a reference cycle with
+the stack frame, keeping all locals in that frame alive until the next garbage
+collection occurs.
 
 .. index::
    module: sys
@@ -258,12 +273,12 @@
 
 Before an except clause's suite is executed, details about the exception are
 stored in the :mod:`sys` module and can be access via :func:`sys.exc_info`.
-:func:`sys.exc_info` returns a 3-tuple consisting of: ``exc_type`` receives the
-object identifying the exception; ``exc_value`` receives the exception's
-parameter; ``exc_traceback`` receives a traceback object (see section
-:ref:`types`) identifying the point in the program where the exception
-occurred. :func:`sys.exc_info` values are restored to their previous values
-(before the call) when returning from a function that handled an exception.
+:func:`sys.exc_info` returns a 3-tuple consisting of: ``exc_type``, the
+exception class; ``exc_value``, the exception instance; ``exc_traceback``, a
+traceback object (see section :ref:`types`) identifying the point in the program
+where the exception occurred. :func:`sys.exc_info` values are restored to their
+previous values (before the call) when returning from a function that handled an
+exception.
 
 .. index::
    keyword: else
@@ -303,6 +318,12 @@
 and information on using the :keyword:`raise` statement to generate exceptions
 may be found in section :ref:`raise`.
 
+.. seealso::
+
+   :pep:`3110` - Catching exceptions in Python 3000
+      Describes the differences in :keyword:`try` statements between Python 2.x
+      and 3.0.
+
 
 .. _with:
 
@@ -312,9 +333,9 @@
 .. index:: statement: with
 
 The :keyword:`with` statement is used to wrap the execution of a block with
-methods defined by a context manager (see section :ref:`context-managers`). This
-allows common :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` usage
-patterns to be encapsulated for convenient reuse.
+methods defined by a context manager (see section :ref:`context-managers`).
+This allows common :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally`
+usage patterns to be encapsulated for convenient reuse.
 
 .. productionlist::
    with_stmt: "with" `expression` ["as" `target`] ":" `suite`
@@ -330,35 +351,27 @@
 
    .. note::
 
-      The :keyword:`with` statement guarantees that if the :meth:`__enter__` method
-      returns without an error, then :meth:`__exit__` will always be called. Thus, if
-      an error occurs during the assignment to the target list, it will be treated the
-      same as an error occurring within the suite would be. See step 5 below.
+      The :keyword:`with` statement guarantees that if the :meth:`__enter__`
+      method returns without an error, then :meth:`__exit__` will always be
+      called.  Thus, if an error occurs during the assignment to the target
+      list, it will be treated the same as an error occurring within the suite
+      would be.  See step 5 below.
 
 #. The suite is executed.
 
-#. The context manager's :meth:`__exit__` method is invoked. If an exception
+#. The context manager's :meth:`__exit__` method is invoked.  If an exception
    caused the suite to be exited, its type, value, and traceback are passed as
    arguments to :meth:`__exit__`. Otherwise, three :const:`None` arguments are
    supplied.
 
    If the suite was exited due to an exception, and the return value from the
-   :meth:`__exit__` method was false, the exception is reraised. If the return
+   :meth:`__exit__` method was false, the exception is reraised.  If the return
    value was true, the exception is suppressed, and execution continues with the
    statement following the :keyword:`with` statement.
 
-   If the suite was exited for any reason other than an exception, the return value
-   from :meth:`__exit__` is ignored, and execution proceeds at the normal location
-   for the kind of exit that was taken.
-
-.. note::
-
-   In Python 2.5, the :keyword:`with` statement is only allowed when the
-   ``with_statement`` feature has been enabled.  It will always be enabled in
-   Python 2.6.  This ``__future__`` import statement can be used to enable the
-   feature::
-
-      from __future__ import with_statement
+   If the suite was exited for any reason other than an exception, the return
+   value from :meth:`__exit__` is ignored, and execution proceeds at the normal
+   location for the kind of exit that was taken.
 
 
 .. seealso::
@@ -376,10 +389,10 @@
 .. index::
    pair: function; definition
    statement: def
-
-.. index::
    object: user-defined function
    object: function
+   pair: function; name
+   pair: name; binding
 
 A function definition defines a user-defined function object (see section
 :ref:`types`):
@@ -398,9 +411,6 @@
    defparameter: `parameter` ["=" `expression`]
    funcname: `identifier`
 
-.. index::
-   pair: function; name
-   pair: name; binding
 
 A function definition is an executable statement.  Its execution binds the
 function name in the current local namespace to a function object (a wrapper
@@ -416,13 +426,13 @@
 that contains the function definition.  The result must be a callable, which is
 invoked with the function object as the only argument. The returned value is
 bound to the function name instead of the function object.  Multiple decorators
-are applied in nested fashion. For example, the following code::
+are applied in nested fashion. For example, the following code ::
 
    @f1(arg)
    @f2
    def func(): pass
 
-is equivalent to::
+is equivalent to ::
 
    def func(): pass
    func = f1(arg)(f2(func))
@@ -433,16 +443,16 @@
 function is said to have "default parameter values."  For a parameter with a
 default value, the corresponding argument may be omitted from a call, in which
 case the parameter's default value is substituted.  If a parameter has a default
-value, all following parameters up until the  "``*``" must also have a default
-value --- this is a syntactic  restriction that is not expressed by the grammar.
+value, all following parameters up until the "``*``" must also have a default
+value --- this is a syntactic restriction that is not expressed by the grammar.
 
 **Default parameter values are evaluated when the function definition is
-executed.**  This means that the expression is evaluated once, when the function
+executed.** This means that the expression is evaluated once, when the function
 is defined, and that that same "pre-computed" value is used for each call.  This
 is especially important to understand when a default parameter is a mutable
 object, such as a list or a dictionary: if the function modifies the object
 (e.g. by appending an item to a list), the default value is in effect modified.
-This is generally not what was intended.  A way around this  is to use ``None``
+This is generally not what was intended.  A way around this is to use ``None``
 as the default, and explicitly test for it in the body of the function, e.g.::
 
    def whats_on_the_telly(penguin=None):
@@ -451,7 +461,7 @@
        penguin.append("property of the zoo")
        return penguin
 
-Function call semantics are described in more detail in section :ref:`calls`. A
+Function call semantics are described in more detail in section :ref:`calls`.  A
 function call always assigns values to all parameters mentioned in the parameter
 list, either from position arguments, from keyword arguments, or from default
 values.  If the form "``*identifier``" is present, it is initialized to a tuple
@@ -464,13 +474,13 @@
 .. index:: pair: function; annotations
 
 Parameters may have annotations of the form "``: expression``" following the
-parameter name. Any parameter may have an annotation even those of the form
-``*identifier`` or ``**identifier``. Functions may have "return" annotation of
-the form "``-> expression``" after the parameter list. These annotations can be
+parameter name.  Any parameter may have an annotation even those of the form
+``*identifier`` or ``**identifier``.  Functions may have "return" annotation of
+the form "``-> expression``" after the parameter list.  These annotations can be
 any valid Python expression and are evaluated when the function definition is
-executed. Annotations may be evaluated in a different order than they appear in
-the source code. The presence of annotations does not change the semantics of a
-function. The annotation values are available as values of a dictionary  keyed
+executed.  Annotations may be evaluated in a different order than they appear in
+the source code.  The presence of annotations does not change the semantics of a
+function.  The annotation values are available as values of a dictionary keyed
 by the parameters' names in the :attr:`__annotations__` attribute of the
 function object.
 
@@ -499,21 +509,21 @@
 .. index::
    pair: class; definition
    statement: class
-
-.. index:: object: class
+   object: class
+   single: inheritance
+   pair: class; name
+   pair: name; binding
+   pair: execution; frame
 
 A class definition defines a class object (see section :ref:`types`):
 
+.. XXX need to document PEP 3115 changes here (new metaclasses)
+
 .. productionlist::
-   classdef: "class" `classname` [`inheritance`] ":" `suite`
+   classdef: [`decorators`] "class" `classname` [`inheritance`] ":" `suite`
    inheritance: "(" [`expression_list`] ")"
    classname: `identifier`
 
-.. index::
-   single: inheritance
-   pair: class; name
-   pair: name; binding
-   pair: execution; frame
 
 A class definition is an executable statement.  It first evaluates the
 inheritance list, if present.  Each item in the inheritance list should evaluate
@@ -526,6 +536,17 @@
 the saved local namespace for the attribute dictionary.  The class name is bound
 to this class object in the original local namespace.
 
+Classes can also be decorated; as with functions, ::
+
+   @f1(arg)
+   @f2
+   class Foo: pass
+
+is equivalent to ::
+
+   class Foo: pass
+   Foo = f1(arg)(f2(Foo))
+
 **Programmer's note:** Variables defined in the class definition are class
 variables; they are shared by all instances.  To define instance variables, they
 must be given a value in the :meth:`__init__` method or in another method.  Both
@@ -537,6 +558,12 @@
 
 .. XXX add link to descriptor docs above
 
+.. seealso::
+
+   :pep:`3129` - Class Decorators
+
+
+
 .. rubric:: Footnotes
 
 .. [#] The exception is propogated to the invocation stack only if there is no

Modified: python/branches/py3k/Doc/reference/expressions.rst
==============================================================================
--- python/branches/py3k/Doc/reference/expressions.rst	(original)
+++ python/branches/py3k/Doc/reference/expressions.rst	Fri Sep  7 19:52:53 2007
@@ -183,6 +183,9 @@
 nesting from left to right, and evaluating the expression to produce an element
 each time the innermost block is reached.
 
+Note that the comprehension is executed in a separate scope, so names assigned
+to in the target list don't "leak" in the enclosing scope.
+
 
 .. _lists:
 
@@ -340,6 +343,12 @@
 where should the execution continue after it yields; the control is always
 transfered to the generator's caller.
 
+The :keyword:`yield` statement is allowed in the :keyword:`try` clause of a
+:keyword:`try` ...  :keyword:`finally` construct.  If the generator is not
+resumed before it is finalized (by reaching a zero reference count or by being
+garbage collected), the generator-iterator's :meth:`close` method will be
+called, allowing any pending :keyword:`finally` clauses to execute.
+
 .. index:: object: generator
 
 The following generator's methods can be used to control the execution of a
@@ -428,6 +437,9 @@
 
 .. seealso::
 
+   :pep:`0255` - Simple Generators
+      The proposal for adding generators and the :keyword:`yield` statement to Python.
+
    :pep:`0342` - Coroutines via Enhanced Generators
       The proposal to enhance the API and syntax of generators, making them
       usable as simple coroutines.

Modified: python/branches/py3k/Doc/reference/simple_stmts.rst
==============================================================================
--- python/branches/py3k/Doc/reference/simple_stmts.rst	(original)
+++ python/branches/py3k/Doc/reference/simple_stmts.rst	Fri Sep  7 19:52:53 2007
@@ -25,6 +25,7 @@
               : | `continue_stmt`
               : | `import_stmt`
               : | `global_stmt`
+              : | `nonlocal_stmt`
 
 
 .. _exprstmts:
@@ -33,6 +34,7 @@
 =====================
 
 .. index:: pair: expression; statement
+.. index:: pair: expression; list
 
 Expression statements are used (mostly interactively) to compute and write a
 value, or (usually) to call a procedure (a function that returns no meaningful
@@ -43,8 +45,6 @@
 .. productionlist::
    expression_stmt: `expression_list`
 
-.. index:: pair: expression; list
-
 An expression statement evaluates the expression list (which may be a single
 expression).
 
@@ -59,9 +59,8 @@
 
 In interactive mode, if the value is not ``None``, it is converted to a string
 using the built-in :func:`repr` function and the resulting string is written to
-standard output (see :func:`print`) on a line by itself.  (Expression
-statements yielding ``None`` are not written, so that procedure calls do not
-cause any output.)
+standard output on a line by itself (except if the result is ``None``, so that
+procedure calls do not cause any output.)
 
 
 .. _assert:
@@ -72,6 +71,8 @@
 .. index::
    statement: assert
    pair: debugging; assertions
+   single: __debug__
+   exception: AssertionError
 
 Assert statements are a convenient way to insert debugging assertions into a
 program:
@@ -87,23 +88,19 @@
 The extended form, ``assert expression1, expression2``, is equivalent to ::
 
    if __debug__:
-      if not expression1: raise AssertionError, expression2
-
-.. index::
-   single: __debug__
-   exception: AssertionError
+      if not expression1: raise AssertionError(expression2)
 
-These equivalences assume that ``__debug__`` and :exc:`AssertionError` refer to
-the built-in variables with those names.  In the current implementation, the
-built-in variable ``__debug__`` is ``True`` under normal circumstances,
-``False`` when optimization is requested (command line option -O).  The current
-code generator emits no code for an assert statement when optimization is
-requested at compile time.  Note that it is unnecessary to include the source
+These equivalences assume that :data:`__debug__` and :exc:`AssertionError` refer
+to the built-in variables with those names.  In the current implementation, the
+built-in variable :data:`__debug__` is ``True`` under normal circumstances,
+``False`` when optimization is requested (command line option ``-O``).  The
+current code generator emits no code for an assert statement when optimization
+is requested at compile time.  Note that it is unnecessary to include the source
 code for the expression that failed in the error message; it will be displayed
 as part of the stack trace.
 
-Assignments to ``__debug__`` are illegal.  The value for the built-in variable
-is determined when the interpreter starts.
+Assignments to :data:`__debug__` are illegal.  The value for the built-in
+variable is determined when the interpreter starts.
 
 
 .. _assignment:
@@ -130,12 +127,11 @@
          : | `attributeref`
          : | `subscription`
          : | `slicing`
+         : | "*" `target`
 
 (See section :ref:`primaries` for the syntax definitions for the last three
 symbols.)
 
-.. index:: pair: expression; list
-
 An assignment statement evaluates the expression list (remember that this can be
 a single expression or a comma-separated list, the latter yielding a tuple) and
 assigns the single resulting object to each of the target lists, from left to
@@ -154,48 +150,45 @@
 
 .. index:: triple: target; list; assignment
 
-Assignment of an object to a target list is recursively defined as follows.
+Assignment of an object to a target list, optionally enclosed in parentheses or
+square brackets, is recursively defined as follows.
 
 * If the target list is a single target: The object is assigned to that target.
 
-* If the target list is a comma-separated list of targets: The object must be a
-  sequence with the same number of items as there are targets in the target list,
-  and the items are assigned, from left to right, to the corresponding targets.
-  (This rule is relaxed as of Python 1.5; in earlier versions, the object had to
-  be a tuple.  Since strings are sequences, an assignment like ``a, b = "xy"`` is
-  now legal as long as the string has the right length.)
+* If the target list is a comma-separated list of targets:
+
+  * If the target list contains one target prefixed with an asterisk, called a
+    "starred" target: The object must be a sequence with at least as many items
+    as there are targets in the target list, minus one.  The first items of the
+    sequence are assigned, from left to right, to the targets before the starred
+    target.  The final items of the sequence are assigned to the targets after
+    the starred target.  A list of the remaining items in the sequence is then
+    assigned to the starred target (the list can be empty).
+
+  * Else: The object must be a sequence with the same number of items as there
+    are targets in the target list, and the items are assigned, from left to
+    right, to the corresponding targets.
 
 Assignment of an object to a single target is recursively defined as follows.
 
 * If the target is an identifier (name):
 
-    .. index:: statement: global
-
-* If the name does not occur in a :keyword:`global` statement in the current
-    code block: the name is bound to the object in the current local namespace.
-
-* Otherwise: the name is bound to the object in the current global namespace.
-
-  .. index:: single: destructor
-
-  The name is rebound if it was already bound.  This may cause the reference count
-  for the object previously bound to the name to reach zero, causing the object to
-  be deallocated and its destructor (if it has one) to be called.
-
-  .. % nested
-
-* If the target is a target list enclosed in parentheses or in square brackets:
-  The object must be a sequence with the same number of items as there are targets
-  in the target list, and its items are assigned, from left to right, to the
-  corresponding targets.
-
-  .. index:: pair: attribute; assignment
+  * If the name does not occur in a :keyword:`global` or :keyword:`nonlocal`
+    statement in the current code block: the name is bound to the object in the
+    current local namespace.
+
+  * Otherwise: the name is bound to the object in the global namespace or the
+    outer namespace determined by :keyword:`nonlocal`, respectively.
+
+  The name is rebound if it was already bound.  This may cause the reference
+  count for the object previously bound to the name to reach zero, causing the
+  object to be deallocated and its destructor (if it has one) to be called.
 
 * If the target is an attribute reference: The primary expression in the
   reference is evaluated.  It should yield an object with assignable attributes;
-  if this is not the case, :exc:`TypeError` is raised.  That object is then asked
-  to assign the assigned object to the given attribute; if it cannot perform the
-  assignment, it raises an exception (usually but not necessarily
+  if this is not the case, :exc:`TypeError` is raised.  That object is then
+  asked to assign the assigned object to the given attribute; if it cannot
+  perform the assignment, it raises an exception (usually but not necessarily
   :exc:`AttributeError`).
 
   .. index::
@@ -203,20 +196,20 @@
      object: mutable
 
 * If the target is a subscription: The primary expression in the reference is
-  evaluated.  It should yield either a mutable sequence object (such as a list) or
-  a mapping object (such as a dictionary). Next, the subscript expression is
+  evaluated.  It should yield either a mutable sequence object (such as a list)
+  or a mapping object (such as a dictionary).  Next, the subscript expression is
   evaluated.
 
   .. index::
      object: sequence
      object: list
 
-  If the primary is a mutable sequence object (such as a list), the subscript must
-  yield a plain integer.  If it is negative, the sequence's length is added to it.
-  The resulting value must be a nonnegative integer less than the sequence's
-  length, and the sequence is asked to assign the assigned object to its item with
-  that index.  If the index is out of range, :exc:`IndexError` is raised
-  (assignment to a subscripted sequence cannot add new items to a list).
+  If the primary is a mutable sequence object (such as a list), the subscript
+  must yield an integer.  If it is negative, the sequence's length is added to
+  it.  The resulting value must be a nonnegative integer less than the
+  sequence's length, and the sequence is asked to assign the assigned object to
+  its item with that index.  If the index is out of range, :exc:`IndexError` is
+  raised (assignment to a subscripted sequence cannot add new items to a list).
 
   .. index::
      object: mapping
@@ -228,19 +221,22 @@
   object.  This can either replace an existing key/value pair with the same key
   value, or insert a new key/value pair (if no key with the same value existed).
 
+  For user-defined objects, the :meth:`__setitem__` method is called with
+  appropriate arguments.
+
   .. index:: pair: slicing; assignment
 
 * If the target is a slicing: The primary expression in the reference is
   evaluated.  It should yield a mutable sequence object (such as a list).  The
   assigned object should be a sequence object of the same type.  Next, the lower
   and upper bound expressions are evaluated, insofar they are present; defaults
-  are zero and the sequence's length.  The bounds should evaluate to (small)
-  integers.  If either bound is negative, the sequence's length is added to it.
-  The resulting bounds are clipped to lie between zero and the sequence's length,
-  inclusive.  Finally, the sequence object is asked to replace the slice with the
-  items of the assigned sequence.  The length of the slice may be different from
-  the length of the assigned sequence, thus changing the length of the target
-  sequence, if the object allows it.
+  are zero and the sequence's length.  The bounds should evaluate to integers.
+  If either bound is negative, the sequence's length is added to it.  The
+  resulting bounds are clipped to lie between zero and the sequence's length,
+  inclusive.  Finally, the sequence object is asked to replace the slice with
+  the items of the assigned sequence.  The length of the slice may be different
+  from the length of the assigned sequence, thus changing the length of the
+  target sequence, if the object allows it.
 
 (In the current implementation, the syntax for targets is taken to be the same
 as for expressions, and invalid syntax is rejected during the code generation
@@ -257,6 +253,12 @@
    print(x)
 
 
+.. seealso::
+
+   :pep:`3132` - Extended Iterable Unpacking
+      The specification for the ``*target`` feature.
+
+
 .. _augassign:
 
 Augmented assignment statements
@@ -312,12 +314,11 @@
 =============================
 
 .. index:: statement: pass
+           pair: null; operation
 
 .. productionlist::
    pass_stmt: "pass"
 
-.. index:: pair: null; operation
-
 :keyword:`pass` is a null operation --- when it is executed, nothing happens.
 It is useful as a placeholder when a statement is required syntactically, but no
 code needs to be executed, for example::
@@ -333,14 +334,12 @@
 ============================
 
 .. index:: statement: del
+           pair: deletion; target
+           triple: deletion; target; list
 
 .. productionlist::
    del_stmt: "del" `target_list`
 
-.. index::
-   pair: deletion; target
-   triple: deletion; target; list
-
 Deletion is recursively defined very similar to the way assignment is defined.
 Rather that spelling it out in full details, here are some hints.
 
@@ -350,7 +349,7 @@
    statement: global
    pair: unbinding; name
 
-Deletion of a name removes the binding of that name  from the local or global
+Deletion of a name removes the binding of that name from the local or global
 namespace, depending on whether the name occurs in a :keyword:`global` statement
 in the same code block.  If the name is unbound, a :exc:`NameError` exception
 will be raised.
@@ -374,14 +373,12 @@
 ===============================
 
 .. index:: statement: return
+           pair: function; definition
+           pair: class; definition
 
 .. productionlist::
    return_stmt: "return" [`expression_list`]
 
-.. index::
-   pair: function; definition
-   pair: class; definition
-
 :keyword:`return` may only occur syntactically nested in a function definition,
 not within a nested class definition.
 
@@ -407,59 +404,11 @@
 The :keyword:`yield` statement
 ==============================
 
-.. index:: statement: yield
-
 .. productionlist::
    yield_stmt: `yield_expression`
 
-.. index::
-   single: generator; function
-   single: generator; iterator
-   single: function; generator
-   exception: StopIteration
-
-The :keyword:`yield` statement is only used when defining a generator function,
-and is only used in the body of the generator function. Using a :keyword:`yield`
-statement in a function definition is sufficient to cause that definition to
-create a generator function instead of a normal function.
-
-When a generator function is called, it returns an iterator known as a generator
-iterator, or more commonly, a generator.  The body of the generator function is
-executed by calling the generator's :meth:`__next__` method repeatedly until it
-raises an exception.
-
-When a :keyword:`yield` statement is executed, the state of the generator is
-frozen and the value of :token:`expression_list` is returned to
-:meth:`__next__`'s caller.  By "frozen" we mean that all local state is
-retained, including the current bindings of local variables, the instruction
-pointer, and the internal evaluation stack: enough information is saved so that
-the next time :meth:`__next__` is invoked, the function can proceed exactly as
-if the :keyword:`yield` statement were just another external call.
-
-As of Python version 2.5, the :keyword:`yield` statement is now allowed in the
-:keyword:`try` clause of a :keyword:`try` ...  :keyword:`finally` construct.  If
-the generator is not resumed before it is finalized (by reaching a zero
-reference count or by being garbage collected), the generator-iterator's
-:meth:`close` method will be called, allowing any pending :keyword:`finally`
-clauses to execute.
-
-.. note::
-
-   In Python 2.2, the :keyword:`yield` statement is only allowed when the
-   ``generators`` feature has been enabled.  It will always be enabled in Python
-   2.3.  This ``__future__`` import statement can be used to enable the feature::
-
-      from __future__ import generators
-
-
-.. seealso::
-
-   :pep:`0255` - Simple Generators
-      The proposal for adding generators and the :keyword:`yield` statement to Python.
-
-   :pep:`0342` - Coroutines via Enhanced Generators
-      The proposal that, among other generator enhancements, proposed allowing
-      :keyword:`yield` to appear inside a :keyword:`try` ... :keyword:`finally` block.
+The yield statement is nothing but a yield expression used as a statement,
+see :ref:`yieldexpr`.
 
 
 .. _raise:
@@ -468,49 +417,45 @@
 ==============================
 
 .. index:: statement: raise
+           pair: raising; exception
 
 .. productionlist::
-   raise_stmt: "raise" [`expression` ["," `expression` ["," `expression`]]]
-
-.. index::
-   single: exception
-   pair: raising; exception
+   raise_stmt: "raise" [`expression` ["from" `expression`]]
 
 If no expressions are present, :keyword:`raise` re-raises the last exception
 that was active in the current scope.  If no exception is active in the current
 scope, a :exc:`TypeError` exception is raised indicating that this is an error
 (if running under IDLE, a :exc:`Queue.Empty` exception is raised instead).
 
-Otherwise, :keyword:`raise` evaluates the expressions to get three objects,
-using ``None`` as the value of omitted expressions.  The first two objects are
-used to determine the *type* and *value* of the exception.
-
-If the first object is an instance, the type of the exception is the class of
-the instance, the instance itself is the value, and the second object must be
-``None``.
-
-If the first object is a class, it becomes the type of the exception. The second
-object is used to determine the exception value: If it is an instance of the
-class, the instance becomes the exception value. If the second object is a
-tuple, it is used as the argument list for the class constructor; if it is
-``None``, an empty argument list is used, and any other object is treated as a
-single argument to the constructor.  The instance so created by calling the
-constructor is used as the exception value.
+Otherwise, :keyword:`raise` evaluates the first expression as the exception
+object.  It must be either a subclass or an instance of :class:`BaseException`.
+If it is a class, the exception instance will be obtained when needed by
+instantiating the class with no arguments.
+
+The :dfn:`type` of the exception is the exception instance's class, the
+:dfn:`value` is the instance itself.
 
 .. index:: object: traceback
 
-If a third object is present and not ``None``, it must be a traceback object
-(see section :ref:`types`), and it is substituted instead of the current
-location as the place where the exception occurred.  If the third object is
-present and not a traceback object or ``None``, a :exc:`TypeError` exception is
-raised.  The three-expression form of :keyword:`raise` is useful to re-raise an
-exception transparently in an except clause, but :keyword:`raise` with no
-expressions should be preferred if the exception to be re-raised was the most
-recently active exception in the current scope.
+A traceback object is normally created automatically when an exception is raised
+and attached to it as the :attr:`__traceback__` attribute; however, you can set
+your own traceback using the :meth:`with_traceback` exception method, like so::
+
+   raise RuntimeError("foo occurred").with_traceback(tracebackobj)
+
+.. XXX document exception chaining
+
+The "from" clause is used for exception chaining, which is not documented yet.
 
 Additional information on exceptions can be found in section :ref:`exceptions`,
 and information about handling exceptions is in section :ref:`try`.
 
+.. seealso::
+
+   :pep:`3109` - Raising exceptions in Python 3000
+      Describes the differences in :keyword:`raise` statements between Python
+      2.x and 3.0.
+
 
 .. _break:
 
@@ -518,26 +463,23 @@
 ==============================
 
 .. index:: statement: break
+           statement: for
+           statement: while
+           pair: loop; statement
 
 .. productionlist::
    break_stmt: "break"
 
-.. index::
-   statement: for
-   statement: while
-   pair: loop; statement
-
 :keyword:`break` may only occur syntactically nested in a :keyword:`for` or
 :keyword:`while` loop, but not nested in a function or class definition within
 that loop.
 
 .. index:: keyword: else
+           pair: loop control; target
 
 It terminates the nearest enclosing loop, skipping the optional :keyword:`else`
 clause if the loop has one.
 
-.. index:: pair: loop control; target
-
 If a :keyword:`for` loop is terminated by :keyword:`break`, the loop control
 target keeps its current value.
 
@@ -554,16 +496,14 @@
 =================================
 
 .. index:: statement: continue
+           statement: for
+           statement: while
+           pair: loop; statement
+           keyword: finally
 
 .. productionlist::
    continue_stmt: "continue"
 
-.. index::
-   statement: for
-   statement: while
-   pair: loop; statement
-   keyword: finally
-
 :keyword:`continue` may only occur syntactically nested in a :keyword:`for` or
 :keyword:`while` loop, but not nested in a function or class definition or
 :keyword:`finally` statement within that loop. [#]_ It continues with the next
@@ -594,7 +534,7 @@
 
 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
+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.
@@ -611,9 +551,9 @@
    pair: module; name
    pair: built-in; module
    pair: user-defined; module
-   module: sys
    pair: filename; extension
    triple: module; search; path
+   module: sys
 
 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
@@ -676,9 +616,6 @@
 
 .. index::
    keyword: from
-   statement: from
-
-.. index::
    triple: hierarchical; module; names
    single: packages
    single: __init__.py
@@ -692,8 +629,6 @@
 http://www.python.org/doc/essays/packages.html for more details, also about how
 the module search works from inside a package.]
 
-.. % 
-
 .. index:: builtin: __import__
 
 The built-in function :func:`__import__` is provided to support applications
@@ -731,10 +666,12 @@
 * blank lines, and
 * other future statements.
 
-The features recognized by Python 2.5 are ``absolute_import``, ``division``,
-``generators``, ``nested_scopes`` and ``with_statement``.  ``generators`` and
-``nested_scopes``  are redundant in Python version 2.3 and above because they
-are always enabled.
+.. XXX change this if future is cleaned out
+
+The features recognized by Python 3.0 are ``absolute_import``, ``division``,
+``generators``, ``nested_scopes`` and ``with_statement``.  They are all
+redundant because they are always enabled, and only kept for backwards
+compatibility.
 
 A future statement is recognized and treated specially at compile time: Changes
 to the semantics of core constructs are often implemented by generating
@@ -762,11 +699,10 @@
 special semantics or syntax restrictions.
 
 Code compiled by calls to the builtin functions :func:`exec` and :func:`compile`
-that occur in a module :mod:`M` containing a future
-statement will, by default, use the new  syntax or semantics associated with the
-future statement.  This can, starting with Python 2.2 be controlled by optional
-arguments to :func:`compile` --- see the documentation of that function
-for details.
+that occur in a module :mod:`M` containing a future statement will, by default,
+use the new syntax or semantics associated with the future statement.  This can
+be controlled by optional arguments to :func:`compile` --- see the documentation
+of that function for details.
 
 A future statement typed at an interactive interpreter prompt will take effect
 for the rest of the interpreter session.  If an interpreter is started with the
@@ -817,6 +753,20 @@
 unaffected by :keyword:`global` statements in the code containing the function
 call.  The same applies to the :func:`eval` and :func:`compile` functions.
 
+
+.. _nonlocal:
+
+The :keyword:`nonlocal` statement
+=================================
+
+.. index:: statement: nonlocal
+
+.. productionlist::
+   nonlocal_stmt: "nonlocal" `identifier` ("," `identifier`)*
+
+XXX: To be documented.
+
+
 .. rubric:: Footnotes
 
 .. [#] It may occur within an :keyword:`except` or :keyword:`else` clause.  The

Modified: python/branches/py3k/Doc/reference/toplevel_components.rst
==============================================================================
--- python/branches/py3k/Doc/reference/toplevel_components.rst	(original)
+++ python/branches/py3k/Doc/reference/toplevel_components.rst	Fri Sep  7 19:52:53 2007
@@ -53,9 +53,9 @@
 
 Under Unix, a complete program can be passed to the interpreter in three forms:
 with the :option:`-c` *string* command line option, as a file passed as the
-first command line argument, or as standard input. If the file or standard input
-is a tty device, the interpreter enters interactive mode; otherwise, it executes
-the file as a complete program.
+first command line argument, or as standard input.  If the file or standard
+input is a tty device, the interpreter enters interactive mode; otherwise, it
+executes the file as a complete program.
 
 
 .. _file-input:


More information about the Python-3000-checkins mailing list