Differences between revisions 4 and 136 (spanning 132 versions)
Revision 4 as of 2004-08-05 19:18:45
Size: 3341
Editor: mail
Comment:
Revision 136 as of 2004-10-21 18:36:55
Size: 2064
Editor: pcp07851797pcs
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
Support for decorators was proposed for Python in [http://www.python.org/peps/pep-0318.html PEP 318], and will be implemented in Python 2.4. [[TableOfContents()]]
Line 3: Line 3:
== What is a decorator == == What is a Decorator ==
Line 5: Line 5:
A decorator is a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated. A decorator is the name used for a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.
Line 11: Line 11:
== Debate about decorators in Python == == What is a Python Decorator ==
Line 13: Line 13:
The winning syntax as of now uses the '@' symbol, as described in [http://mail.python.org/pipermail/python-dev/2004-June/045516.html this message]. Mark Russell implemented this version. [http://mail.python.org/pipermail/patches/2004-July/015452.html Here] is the message describing the patch he checked in. The "decorators" we talk about with concern to Python are not exactly the same thing as the DecoratorPattern described above. A Python decorator is a specific change to the Python syntax that allows us to more conveniently alter functions and methods (and possibly classes in a future version). This supports more readable applications of the DecoratorPattern but also other uses as well.
Line 15: Line 15:
There has been a long discussion about the syntax to use for decorators in Python. See for example these threads: Support for the decorator syntax was proposed for Python in [http://www.python.org/peps/pep-0318.html PEP 318], and will be implemented in Python 2.4.
Line 17: Line 17:
 * http://article.gmane.org/gmane.comp.python.devel/61569
 * http://www.livejournal.com/users/jcalderone/3913.html
Note that the current proposal actually only decorates functions (including methods). Extending it to classes or even arbitrary code is possible, but Guido wasn't sure it made sense. (Later versions might become more permissive, but they can't easily snatch functionality back.)

== The Syntax for Python Decorators ==

The syntax for decorators uses the '@' symbol, as described in [http://mail.python.org/pipermail/python-dev/2004-June/045516.html this message]. Mark Russell implemented this version. [http://mail.python.org/pipermail/patches/2004-July/015452.html Here] is the message describing the patch he checked in.

There was a long discussion about the syntax to use for decorators in Python. Many different proposals were suggested: see PythonDecoratorProposals.
Line 28: Line 33:
Line 31: Line 35:

== Related Resources ==

See also: MixIns, MetaClasses

== Current Decorator Proposals ==

After the @decorator syntax was "accepted", lots of people threw up alarms and a huge series of threads started exploding on Python-dev. Here are the current alternatives that I could find that are being argued, with pros and cons:

'''@decorator "pie decorator syntax"'''
 * + Java-like, so not completely unknown to everyone.
 * + Makes the syntax obvious visually
 * + Will not be silently ignored
 * + Compile-time
 * - Ugly?
 * - Seperate from the def syntax (undesired by some for simple decorators like classmethod/staticmethod)
 * - The @ special character is used in IPython (...)
 * - Punctuation-based syntax raises Perlfears.
 * - Does not nessecarily
    
'''[decorator] "list syntax"'''
 * + C# like
 * + Can be made backwards compatible-ish, with a "hack"
 * + Doesn't cause breakage in existing code-searching tools
 * - Doesn't cause breakage in existing code-searching tools
 * - EuroPython didn't like it ( why? )
 * - The backwards compatability wouldn't be portable to Jython
 * - Looks like a normal expression, but has "magic" behavior of altering a function object
    
'''def decorator function() "inline? syntax?"'''
 * + Simple
 * + Obviousely attached to the function
 * - Does not allow for arguments to the decorator inline.
 * - The natural place where everyone looks for the function name now is a possible container for other information
 * - Complicates things like colorization and other functions of helper tools
    
'''as decorator'''
 * + Non-punctuation based
 * + Does not use an existing mechanism with 'magic' behavior
 * - Guido specifically vetos: "as" means "rename" in too many logical, common places that are in-use, and decorators do not rename.
    
'''with decorator'''
 * + The benefits of "as" without the renaming oddity.
 * + Reads as, "with decorator define function", which seems accurate. Such as, "with staticmethod define foobar(baz)".
 * - Adds a new keyword?

    
See PythonDecoratorLibrary for more complex and real-world examples. See also MixIns and MetaClasses for related resources.

TableOfContents()

What is a Decorator

A decorator is the name used for a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.

For more information about the decorator pattern in general, see:

What is a Python Decorator

The "decorators" we talk about with concern to Python are not exactly the same thing as the DecoratorPattern described above. A Python decorator is a specific change to the Python syntax that allows us to more conveniently alter functions and methods (and possibly classes in a future version). This supports more readable applications of the DecoratorPattern but also other uses as well.

Support for the decorator syntax was proposed for Python in [http://www.python.org/peps/pep-0318.html PEP 318], and will be implemented in Python 2.4.

Note that the current proposal actually only decorates functions (including methods). Extending it to classes or even arbitrary code is possible, but Guido wasn't sure it made sense. (Later versions might become more permissive, but they can't easily snatch functionality back.)

The Syntax for Python Decorators

The syntax for decorators uses the '@' symbol, as described in [http://mail.python.org/pipermail/python-dev/2004-June/045516.html this message]. Mark Russell implemented this version. [http://mail.python.org/pipermail/patches/2004-July/015452.html Here] is the message describing the patch he checked in.

There was a long discussion about the syntax to use for decorators in Python. Many different proposals were suggested: see PythonDecoratorProposals.

Examples

   1 @classmethod
   2 def foo (arg1, arg2):
   3     ....

See PythonDecoratorLibrary for more complex and real-world examples. See also MixIns and MetaClasses for related resources.

PythonDecorators (last edited 2016-05-20 20:14:18 by FranciscoReyes)

Unable to edit the page? See the FrontPage for instructions.