En Tue, 29 Jul 2008 08:45:02 -0300, Themis Bourdenas <[EMAIL PROTECTED]> escribi�:

On Mon, Jul 28, 2008 at 11:12 AM, Gabriel Genellina
<[EMAIL PROTECTED]>wrote:

En Sun, 27 Jul 2008 15:26:39 -0300, Themistoklis Bourdenas <
[EMAIL PROTECTED]> escribió:

> On a related note, as the actual instance method of myclass is not foo
but
> decorate(foo), why are they called method decorators? This does not
decorate
> methods, they decorate functions and eventually the decorated functions > become methods. The name method decorator sounds a bit misleading to me.

Where have you found it? I've always seen the expression "function
decorator" or just "decorator", not "method decorator".

well a few occurrences of it can be found in PEP 318

In a very strict sense, I'd say that all those references to "method decorators" are wrong - because those "def" statements inside a "class" statement define functions, not methods. In that sense almost every Python programmer is wrong too: in this example

class X:
  @decorator
  def foo(self): pass

most (if not all) people would refer to "foo" as "the foo method in class X" - even if foo is really a function, not a method. So a less restrictive meaning is usually adopted - and we all consider "foo" a method, and we're all happy... except in your case, when you just hit a point where the distinction is relevant.
Perhaps a more careful wording in the PEP would help in those corner cases.

> So returning to my original question is there any way I can get the class
> inside decorate()? I guess there is not, but just asking to make sure.

"the class inside decorate"? What do you mean? The type of the x instance in an x.foo() call? That should be determined inside the wrapped function
-when it is actually called-.

Yes, what I was hoping is that it might be possible to get the name of the
class the function is eventually is going to be bound to, but I guess that's not very likely to be possible. I wanted the name well before the function
is called, actually even before an instance of the class is created.

No, I think it's not possible - not using a function decorator, because when it is applied, the class doesn't exist yet. You might use a metaclass (or a class decorator, available on 2.6 and 3.0); iterate over the dictionary of the class about to be created and process their functions in any way you like.

Anyway,
I 've solved my problem with other means. Just out curiosity though, has
there been any talk about actual method decorators? I guess you can work
around them with the introduction of class decorators or even now with
meta-classes, but you have to wrap methods manually with no syntactic sugar.

Mmm... methods are ephemeral objects, once the call is completed, the method usually gets destroyed, so I don't think a true "method decorator" would be very useful. If you really want to customize a method, since they are created by the function type's __get__, a crazy idea would be to inherit from the function type and return something different in its __get__ - but I've never done something like that and don't even know if it's possible at all...

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to