Add PEP 3129, 'Class Decorators'.
This commit is contained in:
parent
0129f4bde8
commit
976c704677
|
@ -127,6 +127,7 @@ Index by Category
|
|||
S 3126 Remove Implicit String Concatenation Jewett
|
||||
S 3127 Integer Literal Support and Syntax Maupin
|
||||
S 3128 BList: A Faster List-like Type Stutzbach
|
||||
S 3129 Class Decorators Winter
|
||||
S 3141 A Type Hierarchy for Numbers Yasskin
|
||||
|
||||
Finished PEPs (done, implemented in Subversion)
|
||||
|
@ -496,6 +497,7 @@ Numerical Index
|
|||
S 3126 Remove Implicit String Concatenation Jewett
|
||||
S 3127 Integer Literal Support and Syntax Maupin
|
||||
S 3128 BList: A Faster List-like Type Stutzbach
|
||||
S 3129 Class Decorators Winter
|
||||
S 3141 A Type Hierarchy for Numbers Yasskin
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
PEP: 3129
|
||||
Title: Class Decorators
|
||||
Version: $Revision: 53815 $
|
||||
Last-Modified: $Date: 2007-04-27 16:42:06 -0700 (Fri, 27 Apr 2007) $
|
||||
Author: Collin Winter <collinw at gmail.com>
|
||||
Status: Draft
|
||||
Type: Standards Track
|
||||
Content-Type: text/x-rst
|
||||
Created: 1-May-2007
|
||||
Python-Version: 3.0
|
||||
Post-History:
|
||||
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This PEP proposes class decorators, an extension to the function
|
||||
and method decorators introduced in PEP 318.
|
||||
|
||||
|
||||
Rationale
|
||||
=========
|
||||
|
||||
When function decorators were originally debated for inclusion in
|
||||
Python 2.4, class decorators were seen as obscure and unnecessary
|
||||
[#obscure]_ thanks to metaclasses. After several years' experience
|
||||
with the Python 2.4.x series of releases and an increasing
|
||||
familiarity with function decorators and their uses, the BDFL and
|
||||
the community re-evaluated class decorators and recommended their
|
||||
inclusion in Python 3.0 [#approval]_.
|
||||
|
||||
The motivating use-case was to make certain constructs more easily
|
||||
expressed and less reliant on implementation details of the CPython
|
||||
interpreter. While it is possible to express class decorator-like
|
||||
functionality using metaclasses, the results are generally
|
||||
unpleasant and the implementation highly fragile [#motivation]_. The
|
||||
fact that large-scale Python projects like Zope were going through
|
||||
these wild contortions to achieve something like class decorators won
|
||||
over the BDFL.
|
||||
|
||||
|
||||
Semantics
|
||||
=========
|
||||
|
||||
The semantics and design goals of class decorators are the same as
|
||||
for function decorators ([#semantics]_, [#goals]_); the only
|
||||
difference is that you're decorating a class instead of a function.
|
||||
The following two snippets are semantically identical: ::
|
||||
|
||||
class A:
|
||||
pass
|
||||
A = foo(bar(A))
|
||||
|
||||
|
||||
@foo
|
||||
@bar
|
||||
class A:
|
||||
pass
|
||||
|
||||
For a detailed examination of decorators, please refer to PEP 318.
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
The grammar for class declarations changes from ::
|
||||
|
||||
classdef: 'class' NAME ['(' [testlist] ')'] ':' suite
|
||||
|
||||
to ::
|
||||
|
||||
classdef: [decorators] 'class' NAME ['(' [testlist] ')'] ':' suite
|
||||
|
||||
The Python AST and bytecode must be modified accordingly.
|
||||
|
||||
A reference implementation [#implementation]_ has been provided by
|
||||
Jack Diederich.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [#obscure]
|
||||
http://www.python.org/dev/peps/pep-0318/#motivation
|
||||
|
||||
.. [#approval]
|
||||
http://mail.python.org/pipermail/python-dev/2006-March/062942.html
|
||||
|
||||
.. [#motivation]
|
||||
http://mail.python.org/pipermail/python-dev/2006-March/062888.html
|
||||
|
||||
.. [#semantics]
|
||||
http://www.python.org/dev/peps/pep-0318/#current-syntax
|
||||
|
||||
.. [#goals]
|
||||
http://www.python.org/dev/peps/pep-0318/#design-goals
|
||||
|
||||
.. [#implementation]
|
||||
http://python.org/sf/1671208
|
||||
|
||||
|
||||
|
||||
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:
|
Loading…
Reference in New Issue