[Python-checkins] python/dist/src/Doc/whatsnew whatsnew24.tex, 1.78, 1.79

akuchling at users.sourceforge.net akuchling at users.sourceforge.net
Mon Aug 2 15:48:21 CEST 2004


Update of /cvsroot/python/python/dist/src/Doc/whatsnew
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11731

Modified Files:
	whatsnew24.tex 
Log Message:
Add PEP318

Index: whatsnew24.tex
===================================================================
RCS file: /cvsroot/python/python/dist/src/Doc/whatsnew/whatsnew24.tex,v
retrieving revision 1.78
retrieving revision 1.79
diff -C2 -d -r1.78 -r1.79
*** whatsnew24.tex	2 Aug 2004 12:44:28 -0000	1.78
--- whatsnew24.tex	2 Aug 2004 13:48:18 -0000	1.79
***************
*** 185,195 ****
  \section{PEP 318: Decorators for Functions, Methods and Classes}
  
! % XXX write this section
  
  \begin{seealso}
  \seepep{318}{Decorators for Functions, Methods and Classes}{Written 
! by Kevin D. Smith, Jim Jewett, and Skip Montanaro.  Several people wrote
! patches implementing function decorators, but the one that was actually 
! checked in was patch #979728, written by Mark Russell.}
  \end{seealso}
  
--- 185,322 ----
  \section{PEP 318: Decorators for Functions, Methods and Classes}
  
! Python 2.2 extended Python's object model by adding static methods and
! class methods, but it didn't extend Python's syntax to provide any new
! way of defining static or class methods.  Instead, you had to write a
! \keyword{def} statement in the usual way, and pass the resulting
! method to a \function{staticmethod()} or \function{classmethod()}
! function that would wrap up the function as a method of the new type.
! Your code would look like this:
! 
! \begin{verbatim}
! class C:
!    def meth (cls):
!        ...
!    
!    meth = classmethod(meth)   # Rebind name to wrapped-up class method
! \end{verbatim}
! 
! If the method was very long, it would be easy to miss or forget the
! \function{classmethod()} invocation after the function body.  
! 
! The intention was always to add some syntax to make such definitions
! more readable, but at the time of 2.2's release a good syntax was not
! obvious.  Years later, when Python 2.4 is coming out, a good syntax
! \emph{still} isn't obvious but users are asking for easier access to
! the feature, so a new syntactic feature has been added.
! 
! The feature is called ``function decorators''.  The name comes from
! the idea that \function{classmethod}, \function{staticmethod}, and
! friends are storing additional information on a function object; they're
! \emph{decorating} functions with more details.  
! 
! The notation borrows from Java and uses the \samp{@} character as an
! indicator.  Using the new syntax, the example above would be written:
! 
! \begin{verbatim}
! class C:
! 
!    @classmethod
!    def meth (cls):
!        ...
!    
! \end{verbatim}
! 
! The \code{@classmethod} is shorthand for the
! \code{meth=classmethod(meth} assignment.  More generally, if you have
! the following:
! 
! \begin{verbatim}
! @A @B @C
! def f ():
!     ...
! \end{verbatim}
! 
! It's equivalent to:
! 
! \begin{verbatim}
! def f(): ...
! f = C(B(A(f)))
! \end{verbatim}
! 
! Decorators must come on the line before a function definition, and
! can't be on the same line, meaning that \code{@A def f(): ...} is
! illegal.  You can only decorate function definitions, either at the
! module-level or inside a class; you can't decorate class definitions.
! 
! A decorator is just a function that takes the function to be decorated
! as an argument and returns either the same function or some new
! callable thing.  It's easy to write your own decorators.  The
! following simple example just sets an attribute on the function
! object:
! 
! \begin{verbatim}
! >>> def deco(func):
! ...    func.attr = 'decorated'
! ...    return func
! ...
! >>> @deco
! ... def f(): pass
! ...
! >>> f
! <function f at 0x402ef0d4>
! >>> f.attr
! 'decorated'
! >>>
! \end{verbatim}
! 
! As a slightly more realistic example, the following decorator checks
! that the supplied argument is an integer:
! 
! \begin{verbatim}
! def require_int (func):
!     def wrapper (arg):
!         assert isinstance(arg, int)
!         return func(arg)
! 
!     return wrapper
! 
! @require_int
! def p1 (arg):
!     print arg
! 
! @require_int
! def p2(arg):
!     print arg*2
! \end{verbatim}
! 
! An example in \pep{318} contains a fancier version of this idea that
! lets you specify the required type and check the returned type as
! well.
! 
! Decorator functions can take arguments.  If arguments are supplied,
! the decorator function is called with only those arguments and must
! return a new decorator function; this new function must take a single
! function and return a function, as previously described.  In other
! words, \code{@A @B @C(args)} becomes:
! 
! \begin{verbatim}
! def f(): ...
! _deco = C(args)
! f = _deco(B(A(f)))
! \end{verbatim}
! 
! Getting this right can be slightly brain-bending, but it's not too
! difficult.
! 
! The new syntax was provisionally added in 2.4alpha2, and is subject to
! change during the 2.4alpha release cycle depending on the Python
! community's reaction.  Post-2.4 versions of Python will preserve
! compatibility with whatever syntax is used in 2.4final.
  
  \begin{seealso}
  \seepep{318}{Decorators for Functions, Methods and Classes}{Written 
! by Kevin D. Smith, Jim Jewett, and Skip Montanaro.  Several people
! wrote patches implementing function decorators, but the one that was
! actually checked in was patch #979728, written by Mark Russell.}
  \end{seealso}
  



More information about the Python-checkins mailing list