[Python-checkins] r53169 - peps/trunk/pep-3107.txt

neal.norwitz python-checkins at python.org
Thu Dec 28 05:59:17 CET 2006


Author: neal.norwitz
Date: Thu Dec 28 05:59:16 2006
New Revision: 53169

Modified:
   peps/trunk/pep-3107.txt
Log:
Update from Tony Lownds sent in private mail and to python-3000

Modified: peps/trunk/pep-3107.txt
==============================================================================
--- peps/trunk/pep-3107.txt	(original)
+++ peps/trunk/pep-3107.txt	Thu Dec 28 05:59:16 2006
@@ -3,7 +3,7 @@
 Version: $Revision$
 Last-Modified: $Date$
 Author: Collin Winter <collinw at gmail.com>,
-        Tony Lownds <tony at pagedna.com>
+        Tony Lownds <tony at lownds.com>
 Status: Draft
 Type: Standards Track
 Requires: 362
@@ -51,9 +51,8 @@
 
    By itself, Python does not attach any particular meaning or
    significance to annotations.  Left to its own, Python simply makes
-   these expressions available as the values in the
-   ``__signature__.annotations`` mapping described in `Accessing
-   Function Annotations`_ below.
+   these expressions available as described in `Accessing Function 
+   Annotations`_ below.
 
    The only way that annotations take on meaning is when they are
    interpreted by third-party libraries.  These annotation consumers
@@ -98,38 +97,33 @@
 ----------
 
 Annotations for parameters take the form of optional expressions that
-follow the parameter name.  This example indicates that parameters 'a'
-and 'c' should both be a ``Number``, while parameter 'b' should
-be a ``Mapping``::
+follow the parameter name.  This example indicates that parameters
+'a' and 'c' should both be an ``int``, while parameter 'b' should
+be a ``dict``::
 
-    def foo(a: Number, b: Mapping, c: Number = 5):
+    def foo(a: int, b: dict, c: int = 5):
         ...
         
-(Number, Mapping and Sequence are used thoughout this PEP and
-represent the standard `numeric`_, `mapping`_ and `sequence
-protocols`_.)
-
 In pseudo-grammar, parameters now look like ``identifier [:
-expression] [= expression]``.  That is, type annotations always
-precede a parameter's default value and both type annotations and
-default values are optional.  Just like how equal signs are used to
-indicate a default value, colons are used to mark annotations.  All
-annotation expressions are evaluated when the function definition is
-executed.
+expression] [= expression]``.  That is, annotations always precede a
+parameter's default value and both annotations and default values are
+optional.  Just like how equal signs are used to indicate a default
+value, colons are used to mark annotations.  All annotation
+expressions are evaluated when the function definition is executed.
 
 Annotations for excess parameters (i.e., ``*args`` and ``**kwargs``)
 are indicated similarly.  In the following function definition,
-``*args`` is flagged as a list of ``Number``, and ``**kwargs`` is
+``*args`` is flagged as a tuple of ``int``, and ``**kwargs`` is
 marked as a dict whose keys are strings and whose values are of type
-``Sequence``. ::
+``str``::
 
-    def foo(*args: Number, **kwargs: Sequence):
+    def foo(*args: int, **kwargs: str):
         ...
 
 Note that, depending on what annotation-interpreting library you're
 using, the following might also be a valid spelling of the above::
 
-    def foo(*args: [Number], **kwargs: {str: Sequence}):
+    def foo(*args: [int], **kwargs: {str: str}):
         ...
 
 Only the first, however, has the BDFL's blessing [#blessedexcess]_ as
@@ -142,68 +136,99 @@
 The examples thus far have omitted examples of how to annotate the
 type of a function's return value.  This is done like so::
 
-    def sum(*args: Number) -> Number:
+    def sum(*args: int) -> int:
         ...
 
 The parameter list can now be followed by a literal ``->`` and a
 Python expression.  Like the annotations for parameters, this
 expression will be evaluated when the function definition is executed.
 
-The grammar for function definitions [#grammar]_ is now something like::
+The grammar for function definitions [#grammar]_ is now::
 
-    funcdef         ::=     [decorators] "def" funcname "("
-                            [parameter_list] ")" ["->" expression] ":" suite
-    decorators      ::=     decorator+
-    decorator       ::=     "@" dotted_name ["(" [argument_list
-                                                  [","]] ")"] NEWLINE
-    dotted_name     ::=     identifier ("." identifier)*
-    parameter_list  ::=     (defparameter ",")*
-            (  "*" identifier [":" expression]
-                [, "**" identifier [":" expression] ]
-             | "**" identifier [":" expression]
-             | defparameter [","] )
-    defparameter    ::=     parameter [":" expression] ["=" expression]
-    sublist         ::=     parameter ("," parameter)* [","]
-    parameter       ::=     identifier | "(" sublist ")"
-    funcname        ::=     identifier
+    decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
+    decorators: decorator+
+    funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite
+    parameters: '(' [typedargslist] ')'
+    typedargslist: ((tfpdef ['=' test] ',')*
+                    ('*' [tname] (',' tname ['=' test])* [',' '**' tname] 
+                     | '**' tname)
+                    | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
+    tname: NAME [':' test]
+    tfpdef: tname | '(' tfplist ')'
+    tfplist: tfpdef (',' tfpdef)* [',']
+
+Lambda
+------
+
+``lambda``'s syntax does not support annotations.  The syntax of
+``lambda`` could be changed to support annotations, by requiring
+parentheses around the parameter list. However it was decided
+[#lambda]_ not to make this change because:
+
+1. It would be an incompatible change.
+2. Lambda's are neutered anyway.
+3. The lambda can always be changed to a function.
 
 
 Accessing Function Annotations
 ==============================
 
 Once compiled, a function's annotations are available via the
-function's ``__signature__`` attribute, introduced by PEP 362.
-Signature objects include an attribute just for annotations,
-appropriately called ``annotations``.  This attribute is a dictionary,
-mapping parameter names to an object representing the evaluated
-annotation expression.
-
-There is a special key in the ``annotations`` mapping, ``"return"``.
-This key is present only if an annotation was supplied for the
-function's return value.
+function's ``func_annotations`` attribute.  This attribute is 
+a dictionary, mapping parameter names to an object representing 
+the evaluated annotation expression
+
+There is a special key in the ``func_annotations`` mapping,
+``"return"``. This key is present only if an annotation was supplied
+for the function's return value.
 
 For example, the following annotation::
 
-    def foo(a: Number, b: 5 + 6, c: list) -> String:
+    def foo(a: 'x', b: 5 + 6, c: list) -> str:
         ...
 
-would result in a ``__signature__.annotations`` mapping of ::
+would result in a ``func_annotation`` mapping of ::
 
-    {'a': Number,
+    {'a': 'x',
      'b': 11,
      'c': list,
-     'return': String}
+     'return': str}
 
 The ``return`` key was chosen because it cannot conflict with the name
 of a parameter; any attempt to use ``return`` as a parameter name
 would result in a ``SyntaxError``.
 
+``func_annotations`` is an empty dictionary if no there are no
+annotations on the function. ``func_annotations`` is always an empty
+dictionary for functions created from ``lambda`` expressions.
+
+
+Standard Library
+================
+
+pydoc and inspect
+-----------------
+
+The ``pydoc`` module should display the function annotations when
+displaying help for a function. The ``inspect`` module should change
+to support annotations.
+
+
+Relation to Other PEPs
+======================
+
+Function Signature Objects [#pep-362]_
+--------------------------------------
+
+Function Signature Objects should expose the function's annotations.
+The ``Parameter`` object may change or other changes may be warranted.
+
 
 Implementation
 ==============
 
-A sample implementation has been provided [#implementation]_ by Tony
-Lownds.
+A sample implementation for the syntax changes has been provided
+[#implementation]_ by Tony Lownds.  
 
 
 Rejected Proposals
@@ -220,8 +245,8 @@
 
 + Despite considerable discussion about a standard type
   parameterisation syntax, it was decided that this should also be
-  left to third-party libraries. ([#threadimmlist]_, [#threadmixing]_,
-  [#emphasistpls]_)
+  left to third-party libraries. ([#threadimmlist]_,
+  [#threadmixing]_, [#emphasistpls]_)
 
 
 References and Footnotes
@@ -276,6 +301,13 @@
 .. [#grammar]
    http://www.python.org/doc/current/ref/function.html
 
+.. [#lambda]
+   http://mail.python.org/pipermail/python-3000/2006-May/001613.html
+
+.. [#pep-362]
+   http://www.python.org/dev/peps/pep-0362/
+
+   
 
 Copyright
 =========
@@ -291,3 +323,4 @@
    fill-column: 70
    coding: utf-8
    End:
+


More information about the Python-checkins mailing list