[Python-Dev] Decorator order implemented backwards?
Brett C.
bac at OCF.Berkeley.EDU
Sun Aug 15 22:05:28 CEST 2004
Mark Russell wrote:
> On Sun, 2004-08-15 at 08:22, Brett C. wrote:
>
>>Mark Russell wrote:
>>
>>[SNIP - stuff about the order]
>>
>>>I'll do a patch to fix the order and the corresponding tests.
>>>
>>
>>I hope I am not stepping on Mark's toes but I went ahead and fixed it to
>>be bottom-up like the PEP.
>
>
> Now that's what I call timing :-) I finished the patch to fix this
> yesterday and decided to leave it until today to upload (I've been
> swamped this week, hence the delay getting time to do this). I've
> uploaded it now (as patch #1009560) because I think it is a more
> correct fix (as well as also fixing the Lib/compiler package).
>
=) I kept doing cvs update, just waiting for someone to fix this right
in the middle of me doing all of this.
> It turns out that the order of evaluation of issue is more subtle than
> it first appears. Here's the comment from the start of the new
> test_eval_order() in test_decorators.py:
>
> # Evaluating a decorated function involves four steps for each
> # decorator-maker (the function that returns a decorator):
> #
> # 1: Evaluate the decorator-maker name
> # 2: Evaluate the decorator-maker arguments (if any)
> # 3: Call the decorator-maker to make a decorator
> # 4: Call the decorator
> #
> # When there are multiple decorators, these steps should be
> # performed in the above order for each decorator, but we should
> # iterate through the decorators in the reverse of the order
> # they appear in the source.
>
> Your patch results in the evaluation order:
>
> evalname1 evalargs1 makedec1
> evalname2 evalargs2 makedec2
> evalname3 evalargs3 makedec3
> calldec3 calldec2 calldec1
>
> Mine (#1009560) gives:
>
> evalname3 evalargs3 makedec3 calldec3
> evalname2 evalargs2 makedec2 calldec2
> evalname1 evalargs1 makedec1 calldec1
>
> I would defend this as the correct order because it is the same as the
> order you get with the current method (func = staticmethod(func)).
>
I am leaving this up to Guido (seems to have become the default PEP 318
champion) to make the decision on the order. Personally I like my order
more since I would expect evaluation of arguments to be in the order
listed, just the application order to be reversed.
Either way I won't be able to deal with this patch if it is accepted;
with the python-dev Summary coverage period ending today I still have
728 emails to summarize on top of any sent in today so I will be swamped
with that for the rest of the week. I am sure someone else can step up
and applying it if Guido okays the application order.
-Brett
More information about the Python-Dev
mailing list