This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Implementation for PEP 318 using java-style syntax
Type: Stage:
Components: Interpreter Core Versions: Python 2.4
process
Status: closed Resolution: accepted
Dependencies: Superseder:
Assigned To: anthonybaxter Nosy List: anthonybaxter, gvanrossum, mark_t_russell, mwh
Priority: normal Keywords: patch

Created on 2004-06-25 13:26 by mark_t_russell, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
at-deco.diff--2004-08-01 mark_t_russell, 2004-08-01 13:12 Implementation for PEP 318 using java-style syntax
Messages (12)
msg46218 - (view) Author: Mark Russell (mark_t_russell) Date: 2004-06-25 13:26
This implements function decorators using the
Java-style syntax described in
http://mail.python.org/pipermail/python-dev/2004-June/045516.html

As the patch changes the grammar, you'll need to
make sure Include/graminit.h and Python/graminit.c
are writable after applying the patch but before
compiling (after a standard CVS checkout they are
read-only, which stops pgen from working).

Changes: 

   - adding @ as a token
   - changing the grammer for funcdef
   - adding com_decorator in compile.c
   - adding test_decorator.py (based on Guido's version)
msg46219 - (view) Author: Anthony Baxter (anthonybaxter) (Python triager) Date: 2004-07-26 13:30
Logged In: YES 
user_id=29957

After applying this patch, any attempts to use the
newly-built python (I deleted graminit.c and graminit.h, to
make sure they were rebuilt) gives the following on any
'import':

*-s*)  CC='gcc -pthread' LDSHARED='gcc -pthread -shared'
OPT='-DNDEBUG -g -O3 -Wall -Wstrict-prototypes' ./python -E
./setup.py -q build;; \
*)  CC='gcc -pthread' LDSHARED='gcc -pthread -shared'
OPT='-DNDEBUG -g -O3 -Wall -Wstrict-prototypes' ./python -E
./setup.py build;; \
esac
Traceback (most recent call last):
  File "./setup.py", line 6, in ?
    import sys, os, getopt, imp, re
SystemError: compile_node: unexpected node type
make: *** [sharedmods] Error 1
msg46220 - (view) Author: Anthony Baxter (anthonybaxter) (Python triager) Date: 2004-07-26 13:41
Logged In: YES 
user_id=29957

Hm. Pilot error on my part. I had to build once to get
graminit.h and graminit.c rebuilt, then rebuild again (after
nuking all .o files) to get it to work properly. *sigh*
msg46221 - (view) Author: Anthony Baxter (anthonybaxter) (Python triager) Date: 2004-07-26 13:58
Logged In: YES 
user_id=29957

I still get a failure in test_transformer after a make
distclean and rebuild and make distclean and rebuild.

FAILED (errors=1)
Traceback (most recent call last):
  File "Lib/test/test_transformer.py", line 37, in ?
    test_main()
  File "Lib/test/test_transformer.py", line 32, in test_main
    test_support.run_unittest(
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/test/test_support.py",
line 290, in run_unittest
    run_suite(suite, testclass)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/test/test_support.py",
line 275, in run_suite
    raise TestFailed(err)
test.test_support.TestFailed: Traceback (most recent call last):
  File "Lib/test/test_transformer.py", line 16, in
testMultipleLHS
    a = transformer.parse(s)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 50, in parse
    return Transformer().parsesuite(buf)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 120, in parsesuite
    return self.transform(parser.suite(text))
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 113, in transform
    return self.compile_node(tree)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 149, in compile_node
    return self.file_input(node[1:])
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 180, in file_input
    self.com_append_stmt(stmts, node)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 1025, in com_append_stmt
    result = self.com_node(node)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 768, in com_node
    return self._dispatch[node[0]](node[1:])
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 252, in stmt
    return self.com_stmt(nodelist[0])
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 1018, in com_stmt
    result = self.lookup_node(node)(node[1:])
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 312, in expr_stmt
    lval = self.com_augassign(nodelist[0])
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 922, in com_augassign
    l = self.com_node(node)
  File
"/home/anthony/src/py/pyhead/dist/src/Lib/compiler/transformer.py",
line 768, in com_node
    return self._dispatch[node[0]](node[1:])
KeyError: 268
msg46222 - (view) Author: Anthony Baxter (anthonybaxter) (Python triager) Date: 2004-07-26 14:09
Logged In: YES 
user_id=29957

Argh. Our Makefile's ability to Do The Right Thing... is not
good. Rebuilding Lib/symbol.py and Lib/token.py makes this
better. The setup.py really should do this automatically.

So - all tests pass. As far as I can see, things still to be
done for this to be in a2:

- Documentation (can wait until a3, I guess)
- More coverage in test_decorator (ditto)

msg46223 - (view) Author: Michael Hudson (mwh) (Python committer) Date: 2004-07-26 14:20
Logged In: YES 
user_id=6656

Well, PEP 306 is the reference for this sort of thing: also
needed (before 2.4 final) are changes to Lib/compiler and
tokenize.py.  Mark, are you willing/able to work on these?
msg46224 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2004-07-28 03:22
Logged In: YES 
user_id=6380

Before 2.4final I'd like to see some changes to the syntax:

- Instead of @test, it should be somewhat more restricted, 
preferably @ followed by a dotted name followed by an 
optional argument list. @1+2 or @[1,2,3] just doesn't make 
sense IMO.

- I'd like there to always be a newline between the last 
decorator and the 'def' keyword. (This in the sake 
of "greppability" per python-dev discussion.)
msg46225 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2004-07-28 03:39
Logged In: YES 
user_id=6380

There's some non-standard C: in compile.c line 5641 there's a 
char* declaration that isn't at the start of a block. Easily 
fixed but should definitely be fixed before releasing a2.
msg46226 - (view) Author: Mark Russell (mark_t_russell) Date: 2004-07-28 17:37
Logged In: YES 
user_id=1017234

I've added an updated version of the patch, with the
following changes:

     - Applied against CVS head (as of 2004-07-28)
     - Non-standard C removed (see Guido's comment)
     - Newline before the def is now mandatory
     - Grammer for decorator expressions more restricted
     - tokenize.py and test_tokenize updated to handle @ tokens
     - Lib/compiler/transformer.py minimally updated

Still to do:

     - Complete work on Lib/compiler (i.e. get it to the
point where it
       produces a correct .pyc for code with decorators).
     - Write docs
     - Work through all the steps in PEP 306
     - Add more regression tests to test_decorator

I can put in some time on this in the next few days if this
patch seems likely
to be applied.

The grammar is now:

     decorator: '@' dotted_name [ '(' [arglist] ')' ]
     decorators: decorator ([NEWLINE] decorator)* NEWLINE
     funcdef: [decorators] 'def' NAME parameters ':' suite

This allows

     @foo @bar
     def f(): pass

but not:

     @foo @bar def f(): paqss

Issues:

    - Someone should take a look at the "case decorator:"
code in
      symtable_node() in compile.c.  All the tests pass, but
this
      seems a fragile bit of code to be changing

    - Lib/compiler needs some more work - at present
decorators are
      ignored there.  I'll do some more work on this when I
get time
      (probably this weekend).

    - As noted in the comments here, the build system does
not cope
      automatically with grammar changes.  The steps I used
to apply
      the patch are:

	   cd .../dist/src
           patch -p0 < /path/to/patch-file
	   ./configure
	   make
	   chmod +w Lib/symbol.py Lib/token.py
	   ./python Lib/symbol.py
	   ./python Lib/token.py
	   make clean
	   make
	   make test >& make-test.out

       I'm sure this sequence is non-optimal, but it works
for me, and
       all the tests pass on my Linux system afterwards.	   
msg46227 - (view) Author: Mark Russell (mark_t_russell) Date: 2004-07-31 21:49
Logged In: YES 
user_id=1017234

I've updated the patch again.  See my previous
comment here for the procedure to apply the patch.

Main changes:

     - Added decorator support to Lib/compiler.
       test_decorators.py now passes when compiled
       with Lib/compiler.  The regression tests
       also pass when built with
       Tools/compiler/regrtest.py, apart from
       test_dis.py which I assume is due to
       trivial differences in the bytecode output.
       
     - Added a description of decorators to the
       reference manual.  Changed the docs for
       staticmethod and classmethod in the library
       manual to use decorator syntax (with a pointer
       to the decorator description in the
       reference manual).

     - Added more tests to test_decorator.py,
       including some possibly useful example
       decorators (e.g. memoize)

Other changes (not directly related to decorators):
           
     - I regenerated Lib/compiler/ast.py using
       Tools/compiler/astgen.py.  I'm not sure
       whether astgen.py is still in use -- I had
       to tweak it a bit to make the output match
       ast.py.  I changed astgen.py to emit the
       classes in alphabetical rather than dict
       scan order to make it easier to diff the
       output against ast.py

     - test_pyclbr.py had a broken definition of
       assertEquals - it always returned True if
       called with two arguments.  I renamed this
       to assertEqualsOrIgnored and fixed the bug.
       The working test revealed a test failure in
       pyclbr.py:

     - Changed pyclbr to use the full (dotted)
       module name for pyclbr.Class.module attribute
       
Issues:

     - test_pyclbr.py currently fails because its
       is_method() method fails to spot staticmethod-
       and classmethod- wrapped methods.  See the
       comment on the new test test_decorators().
       I'll have another look at this next week.
       Note that this is a problem with the test,
       not the pyclbr.py module.  For now
       test_decorator could just be deleted.
msg46228 - (view) Author: Mark Russell (mark_t_russell) Date: 2004-08-01 13:10
Logged In: YES 
user_id=1017234

Ignore the "Issues:" paragraph in my previous
comment - I made is_method() test_pyclbr.py a bit
smarter and the test now passes.  I also added
a file Lib/test/pyclbr_input.py to use as a
test module rather than test_decorators.py.
msg46229 - (view) Author: Anthony Baxter (anthonybaxter) (Python triager) Date: 2004-08-02 06:16
Logged In: YES 
user_id=29957

Checked in on the trunk. I think I got everything. Thanks
for your work on this!

/cvsroot/python/python/dist/src/Doc/lib/asttable.tex,v  <--
 asttable.tex
new revision: 1.2; previous revision: 1.1
/cvsroot/python/python/dist/src/Doc/lib/libfuncs.tex,v  <--
 libfuncs.tex
new revision: 1.168; previous revision: 1.167
/cvsroot/python/python/dist/src/Doc/ref/ref7.tex,v  <-- 
ref7.tex
new revision: 1.39; previous revision: 1.38
/cvsroot/python/python/dist/src/Grammar/Grammar,v  <--  Grammar
new revision: 1.50; previous revision: 1.49
/cvsroot/python/python/dist/src/Include/graminit.h,v  <-- 
graminit.h
new revision: 2.22; previous revision: 2.21
/cvsroot/python/python/dist/src/Include/node.h,v  <--  node.h
new revision: 2.23; previous revision: 2.22
/cvsroot/python/python/dist/src/Include/token.h,v  <--  token.h
new revision: 2.21; previous revision: 2.20
/cvsroot/python/python/dist/src/Lib/pyclbr.py,v  <--  pyclbr.py
new revision: 1.33; previous revision: 1.32
/cvsroot/python/python/dist/src/Lib/symbol.py,v  <--  symbol.py
new revision: 1.17; previous revision: 1.16
/cvsroot/python/python/dist/src/Lib/token.py,v  <--  token.py
new revision: 1.14; previous revision: 1.13
/cvsroot/python/python/dist/src/Lib/tokenize.py,v  <-- 
tokenize.py
new revision: 1.36; previous revision: 1.35
/cvsroot/python/python/dist/src/Lib/compiler/ast.py,v  <-- 
ast.py
new revision: 1.24; previous revision: 1.23
/cvsroot/python/python/dist/src/Lib/compiler/pycodegen.py,v
 <--  pycodegen.py
/cvsroot/python/python/dist/src/Lib/compiler/symbols.py,v 
<--  symbols.py
new revision: 1.16; previous revision: 1.15
/cvsroot/python/python/dist/src/Lib/compiler/transformer.py,v
 <--  transformer.py
new revision: 1.41; previous revision: 1.40
/cvsroot/python/python/dist/src/Lib/test/pyclbr_input.py,v 
<--  pyclbr_input.py
initial revision: 1.1
/cvsroot/python/python/dist/src/Lib/test/test_decorators.py,v
 <--  test_decorators.py
initial revision: 1.1
/cvsroot/python/python/dist/src/Lib/test/test_parser.py,v 
<--  test_parser.py
new revision: 1.19; previous revision: 1.18
/cvsroot/python/python/dist/src/Lib/test/test_pyclbr.py,v 
<--  test_pyclbr.py
new revision: 1.22; previous revision: 1.21
/cvsroot/python/python/dist/src/Lib/test/tokenize_tests.txt,v
 <--  tokenize_tests.txt
new revision: 1.2; previous revision: 1.1
/cvsroot/python/python/dist/src/Lib/test/output/test_tokenize,v
 <--  test_tokenize
new revision: 1.9; previous revision: 1.8
/cvsroot/python/python/dist/src/Modules/parsermodule.c,v 
<--  parsermodule.c
new revision: 2.83; previous revision: 2.82
/cvsroot/python/python/dist/src/Parser/tokenizer.c,v  <-- 
tokenizer.c
new revision: 2.75; previous revision: 2.74
/cvsroot/python/python/dist/src/Python/compile.c,v  <-- 
compile.c
new revision: 2.310; previous revision: 2.309
/cvsroot/python/python/dist/src/Python/graminit.c,v  <-- 
graminit.c
new revision: 2.36; previous revision: 2.35
/cvsroot/python/python/dist/src/Tools/compiler/ast.txt,v 
<--  ast.txt
new revision: 1.6; previous revision: 1.5
/cvsroot/python/python/dist/src/Tools/compiler/astgen.py,v 
<--  astgen.py
new revision: 1.8; previous revision: 1.7
/cvsroot/python/python/dist/src/Tools/compiler/regrtest.py,v
 <--  regrtest.py
new revision: 1.5; previous revision: 1.4
History
Date User Action Args
2022-04-11 14:56:05adminsetgithub: 40449
2004-06-25 13:26:43mark_t_russellcreate