[Python-Dev] Suggesting '.' decorators (PEP318)

Kevin J. Butler python-kbutler at sabaydi.com
Sat Aug 7 06:55:35 CEST 2004


Many people wrote:
    > Lots of options

I haven't seen this mentioned, so I'm going to throw in my suggestion.

The following makes sense to me, uses previously invalid syntax, and
uses the '.' punctuation in a way similar to existing/proposed usage:

       def longMethodNameForEffect(longArgumentOne=None,
                                   longArgumentTwo=42):
           .staticmethod
           .funcattrs(grammar="'@' dotted_name [ '(' [arglist] ')' ]",
                      status="experimental", author="BDFL")
           """
           asdfasdf
           """
           raise NotYetImplemented

If we want to allow one-liner decorators (questionable to me):

       def myMethod(self): .staticmethod
           raise NotYetImplemented

Advantages/disadvantages of positioning at start of block:

+ Unambiguous "target" for decorators, matches Python's precedents for
indentation and modify-what-came-before

+ Decorators won't get lost in long argument lists (they are indented
differently in Guido's preferred formatting, and are separated by the
smiley in the all-args-on-individual-lines formatting)

+ Separate from def syntax (to keep def the same avoiding breakage)

0 Perhaps decorators should be allowed before or after the docstring. If
you have to choose, I'd choose making it before the docstring.

+ No extra cut-and-paste issues, no extra indentation level.

+ No smileys.  (Does that get a :)  or a  ]:  ?)

Advantages/disadvantages of .decorators:

+ Will not be silently ignored (doesn't use currently legal syntax)

+ Simple for simple decorators, supports complex decorators as cleanly
as possible

+ Less ugly (YMMV). Doesn't feel like executable line noise (to 1 out of
1 pythonistas polled...)

+ No new punctuation or keywords (avoids breaking Leo/IPython/existing code)

+ Really nice syntax for assigning attributes, if desired (Not sure I
like this overloading, but it /looks/ good)

       def func():
           .author = "Kevin Butler"
           pass

+/0 Syntax obvious visually (Someone will complain that the leading
period gets lost - that person should switch to a fixed-width font, as
used when coding.  <.5 wink>) Easy to highlight.

0 Although it is a punctuation-based syntax, it is compatible with
existing/proposed '.' usage ('.' can mean subordination to a containing
construct like 'with', and passing the implicit "func" argument is
analogous to passing "self")

0 Compatible with some future "with ...:" syntax, as decorators must
immediately follow a 'def ...:' (or possibly a 'class ...:'), so if
there is a 'with ...:' what follows cannot be a decorator.

- Minor extension to use of '.'

- Some people may have too much dust on their monitors

Misc items from the PEP applied to .decorators:

+ One decorator per line

+ Could use ".doc()" or ".doc = " as a docstring alternative

?+ Compile time (? as much as the @ syntax is?)

+ Works in interactive mode

Public or private feedback appreciated, I will summarize private
feedback to the list.

kb


More information about the Python-Dev mailing list