Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
add33601
Commit
add33601
authored
Aug 15, 2004
by
Brett Cannon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Correct the order of application for decorators. Meant to be bottom-up and not
top-down. Now matches the PEP.
parent
31f8350f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
23 additions
and
8 deletions
+23
-8
Lib/test/test_decorators.py
Lib/test/test_decorators.py
+16
-7
Misc/NEWS
Misc/NEWS
+3
-0
Python/compile.c
Python/compile.c
+4
-1
No files found.
Lib/test/test_decorators.py
View file @
add33601
...
...
@@ -129,7 +129,8 @@ class TestDecorators(unittest.TestCase):
# XXX: This doesn't work unless memoize is the last decorator -
# see the comment in countcalls.
counts
=
{}
@
countcalls
(
counts
)
@
memoize
@
memoize
@
countcalls
(
counts
)
def
double
(
x
):
return
x
*
2
...
...
@@ -186,12 +187,20 @@ class TestDecorators(unittest.TestCase):
self
.
assertEqual
(
C
.
foo
.
booh
,
42
)
def
test_order
(
self
):
class
C
(
object
):
@
funcattrs
(
abc
=
1
)
@
staticmethod
def
foo
():
return
42
# This wouldn't work if staticmethod was called first
self
.
assertEqual
(
C
.
foo
(),
42
)
self
.
assertEqual
(
C
().
foo
(),
42
)
# Test that decorators are conceptually applied right-recursively;
# that means bottom-up
def
ordercheck
(
num
):
def
deco
(
func
):
return
lambda
:
num
return
deco
# Should go ordercheck(1)(ordercheck(2)(blah)) which should lead to
# blah() == 1
@
ordercheck
(
1
)
@
ordercheck
(
2
)
def
blah
():
pass
self
.
assertEqual
(
blah
(),
1
,
"decorators are meant to be applied "
"bottom-up"
)
def
test_main
():
test_support
.
run_unittest
(
TestDecorators
)
...
...
Misc/NEWS
View file @
add33601
...
...
@@ -12,6 +12,9 @@ What's New in Python 2.4 alpha 3?
Core and builtins
-----------------
- Fix the order of application of decorators. The proper order is bottom-up;
the first decorator listed is the last one called.
- SF patch #1005778. Fix a seg fault if the list size changed while
calling list.index(). This could happen if a rich comparison function
modified the list.
...
...
Python/compile.c
View file @
add33601
...
...
@@ -4132,7 +4132,10 @@ com_decorators(struct compiling *c, node *n)
REQ
(
CHILD
(
n
,
nch
-
1
),
NEWLINE
);
ndecorators
=
0
;
for
(
i
=
NCH
(
n
)
-
1
;
i
>=
0
;
--
i
)
{
/* the application order for decorators is the reverse of how they are
listed; bottom-up */
nch
-=
1
;
for
(
i
=
0
;
i
<
nch
;
i
+=
1
)
{
node
*
ch
=
CHILD
(
n
,
i
);
if
(
TYPE
(
ch
)
!=
NEWLINE
)
{
com_decorator
(
c
,
ch
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment