Function Modifier Syntax, by Kevin D. Smith
This commit is contained in:
parent
9981a257a3
commit
c12fe8dba1
|
@ -0,0 +1,129 @@
|
||||||
|
PEP: 318
|
||||||
|
Title: Function Modifier Syntax
|
||||||
|
Version: $Revision$
|
||||||
|
Last-Modified: $Date$
|
||||||
|
Author: Kevin D. Smith <Kevin.Smith@theMorgue.org>
|
||||||
|
Status: Draft
|
||||||
|
Type: Standards Track
|
||||||
|
Content-Type: text/plain
|
||||||
|
Created: 05-Jun-2003
|
||||||
|
Python-Version: 2.4
|
||||||
|
Post-History:
|
||||||
|
|
||||||
|
|
||||||
|
Abstract
|
||||||
|
|
||||||
|
The current method for declaring class and static methods
|
||||||
|
is awkward and can lead to code that is difficult to understand.
|
||||||
|
This PEP introduces possible new syntax which will place the
|
||||||
|
translation of instance methods to class/static methods at
|
||||||
|
the same point in the code as the method's declaration.
|
||||||
|
|
||||||
|
|
||||||
|
Motivation
|
||||||
|
|
||||||
|
The current method of translating an instance method into a
|
||||||
|
class/static method places the actual translation at a different
|
||||||
|
point in the code than the declaration of the method. The
|
||||||
|
code below demonstrates this.
|
||||||
|
|
||||||
|
def foo(self):
|
||||||
|
perform method operation
|
||||||
|
foo = classmethod(foo)
|
||||||
|
|
||||||
|
When the method is very short, it is easy to look ahead and see
|
||||||
|
that this is a class method. However, if the method is more than
|
||||||
|
15 lines or so, the translation into a class method is not
|
||||||
|
obvious. A solution to this problem is to move the translation
|
||||||
|
of the method to the same point as the method's declaration.
|
||||||
|
|
||||||
|
|
||||||
|
Proposal
|
||||||
|
|
||||||
|
Probably the simplest way to place the function that translates
|
||||||
|
an instance method to a class/static method is illustrated in the
|
||||||
|
code below.
|
||||||
|
|
||||||
|
def classmethod foo(self):
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
The code in this example will simply perform the following.
|
||||||
|
|
||||||
|
def foo(self):
|
||||||
|
perform method operation
|
||||||
|
foo = classmethod(foo)
|
||||||
|
|
||||||
|
This syntax does not introduce any new keywords and is completely
|
||||||
|
backwards compatible with any existing code. The word between the
|
||||||
|
'def' and the actual name of the method is simply a reference to
|
||||||
|
a callable object that returns a new function reference.
|
||||||
|
This syntax could also be extended to allow multiple function
|
||||||
|
modifiers in the form of a space delimited list as follows:
|
||||||
|
|
||||||
|
def protected classmethod foo(self):
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
which would be equivalent to the current form:
|
||||||
|
|
||||||
|
def foo(self):
|
||||||
|
perform method operation
|
||||||
|
foo = protected(classmethod(foo))
|
||||||
|
|
||||||
|
While this syntax is simple and easy to read, it does become
|
||||||
|
cluttered and more obscure if you wish to allow arguments to be
|
||||||
|
sent to the function modifier.
|
||||||
|
|
||||||
|
def synchronized(lock) classmethod foo(self):
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
Various syntaxes have been proposed in comp.lang.python. The
|
||||||
|
most common are demonstrated below.
|
||||||
|
|
||||||
|
def foo(self) [synchronized(lock), classmethod]:
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
def foo(self) {'pre': synchronized(lock), 'classmethod': True}:
|
||||||
|
""" Skip Montanaro syntax """
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
def foo(self) as synchronized(lock), classmethod:
|
||||||
|
""" Gerrit Holl syntax """
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
I have a strong preference for the last of the three. The first
|
||||||
|
two use syntax that just seems arbitrary which does not help the
|
||||||
|
user to understand the meaning of it. The third method is very
|
||||||
|
readable and could probably be interpreted easily by those not
|
||||||
|
familiar with Python.
|
||||||
|
|
||||||
|
|
||||||
|
Conclusion
|
||||||
|
|
||||||
|
The current method of translating an instance method to a class
|
||||||
|
or static method is awkward. A new syntax for applying function
|
||||||
|
modifiers should be implemented (proposed syntax shown below).
|
||||||
|
|
||||||
|
def foo(self) as synchronized(lock), classmethod:
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
More generally,
|
||||||
|
|
||||||
|
def foo(self) as <tuple>:
|
||||||
|
perform method operation
|
||||||
|
|
||||||
|
The proposed syntax is simple, powerful, easy to read, and
|
||||||
|
therefore preserves those qualities of the Python language.
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
End:
|
Loading…
Reference in New Issue