[Python-checkins] r70420 - peps/trunk/pep-0379.txt

georg.brandl python-checkins at python.org
Mon Mar 16 22:07:43 CET 2009


Author: georg.brandl
Date: Mon Mar 16 22:07:42 2009
New Revision: 70420

Log:
Add new PEP 379 from Jervis Whitley.

Added:
   peps/trunk/pep-0379.txt   (contents, props changed)

Added: peps/trunk/pep-0379.txt
==============================================================================
--- (empty file)
+++ peps/trunk/pep-0379.txt	Mon Mar 16 22:07:42 2009
@@ -0,0 +1,188 @@
+PEP: 379
+Title: Adding an Assignment Expression
+Version: $Revision$
+Last-Modified: $Date$
+Author: Jervis Whitley <jervisau at gmail.com>
+Status: Draft
+Type: Standards Track
+Content-Type: text/plain
+Created: 14-Mar-2009
+Python-Version: 3.2
+Post-History:
+
+
+Abstract
+
+    This PEP adds a new assignment expression to the Python language
+    to make it possible to assign the result of an expression in
+    almost any place.  The new expression will allow the assignment of
+    the result of an expression at first use (in a comparison for
+    example).
+
+
+Motivation and Summary
+
+   Issue1714448 "if something as x:" [1] describes a feature to allow
+   assignment of the result of an expression in an if statement to a
+   name.  It supposed that the 'as' syntax could be borrowed for this
+   purpose.  Many times it is not the expression itself that is
+   interesting, rather one of the terms that make up the
+   expression. To be clear, something like this:
+   
+       if (f_result() == [1, 2, 3]) as res:
+
+   seems awfully limited, when this:
+
+       if (f_result() as res) == [1, 2, 3] :
+
+   is probably the desired result. 
+
+
+Use Cases
+    
+    See the Examples section near the end.
+
+
+Specification
+
+    A new expression is proposed with the (nominal) syntax:
+
+        EXPR -> VAR
+
+    This single expression does the following:
+
+    - Evaluate the value of EXPR, an arbitrary expression;
+    - Assign the result to VAR, a single assignment target; and
+    - Leave the result of EXPR on the Top of Stack (TOS)
+    
+    Here '->' or (RARROW) has been used to illustrate the concept that
+    the result of EXPR is assigned to VAR.
+
+    The translation of the proposed syntax is:
+
+        VAR = (EXPR)
+        (EXPR)
+
+    The assignment target can be either an attribute, a subscript or
+    name:
+
+        f() -> name[0]      # where 'name' exists previously.
+
+	f() -> name.attr    # again 'name' exists prior to this
+	expression.
+
+        f() -> name
+
+    This expression should be available anywhere that an expression is
+    currently accepted.
+
+    All exceptions that are currently raised during invalid
+    assignments will continue to be raised when using the assignment
+    expression.  For example, a NameError will be raised when in
+    example 1 and 2 above if 'name' is not previously defined, or an
+    IndexError if index 0 was out of range.
+
+
+Examples from the Standard Library
+
+    The following two examples were chosen after a brief search
+    through the standard library, specifically both are from ast.py
+    which happened to be open at the time of the search.
+
+    Original:
+
+        def walk(node):
+            from collections import deque
+            todo = deque([node])
+            while todo:
+                node = todo.popleft()
+                todo.extend(iter_child_nodes(node))
+                yield node
+
+    Using assignment expression:
+
+        def walk(node):
+            from collections import deque
+            todo = deque([node])
+            while todo:
+                todo.extend(iter_child_nodes(todo.popleft() -> node))
+                yield node
+
+    Original:
+
+        def get_docstring(node, clean=True):
+            if not isinstance(node, (FunctionDef, ClassDef, Module)):
+                raise TypeError("%r can't have docstrings" 
+                                    % node.__class__.__name__)
+            if node.body and isinstance(node.body[0], Expr) and \
+               isinstance(node.body[0].value, Str):
+                if clean:
+                    import inspect
+                    return inspect.cleandoc(node.body[0].value.s)
+                return node.body[0].value.s
+
+    Using assignment expresion:
+
+        def get_docstring(node, clean=True):
+            if not isinstance(node, (FunctionDef, ClassDef, Module)):
+                raise TypeError("%r can't have docstrings" 
+                                    % node.__class__.__name__)
+            if node.body -> body and isinstance(body[0] -> elem, Expr) and \
+               isinstance(elem.value -> value, Str):
+                if clean:
+                    import inspect
+                    return inspect.cleandoc(value.s)
+                return value.s
+
+
+Examples
+
+    The examples shown below highlight some of the desirable features
+    of the assignment expression, and some of the possible corner
+    cases.
+
+    1. Assignment in an if statement for use later.
+
+        def expensive():
+            import time; time.sleep(1)
+            return 'spam'
+
+        if expensive() -> res in ('spam', 'eggs'):
+            dosomething(res)
+
+    2. Assignment in a while loop clause.
+
+        while len(expensive() -> res) == 4:
+            dosomething(res)
+
+    3. Keep the iterator object from the for loop.
+
+        for ch in expensive() -> res:
+            sell_on_internet(res)
+
+    4. Corner case.
+
+        for ch -> please_dont in expensive():
+            pass
+        # who would want to do this? Not I. 
+
+
+References
+
+    [1] Issue1714448 "if something as x:", k0wax 
+        http://bugs.python.org/issue1714448
+
+
+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
+coding: utf-8
+End:


More information about the Python-checkins mailing list