Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Dot operator magic has me stymied...

Reply
Thread Tools

Dot operator magic has me stymied...

 
 
Casey Rodarmor
Guest
Posts: n/a
 
      10-29-2008
Hi All,

I'm trying to use a class as a decorator for another class method, but
it's giving me a lot of grief. Basically, my problem is with the
example below:

>>> class decorator:

.... def __init__(self, function):
.... self.function = function
....
.... def __call__(self, *args, **kwargs):
.... self.function(*args, **kwargs)
....
>>> class Foo:

.... def __init__(self):
.... self.msg = "Hello,"
....
.... @decorator
.... def greet(self, name):
.... print self.msg, name
....
>>> foo = Foo()
>>> foo.greet("Bob")

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "decorate.py", line 6, in __call__
self.function(*args, **kwargs)
TypeError: greet() takes exactly 2 arguments (1 given)


I'm guessing that using a decorator that returns a class instance
instead of a function instance has messed up the magic of the dot
operator, causing it not to bind the foo instance to the self
argument.

Can anybody shed some light on what's happening here?

Also, I really do like using classes as decorators. Are there any
workarounds to get it to work with methods?

Thanks a bunch!

Best regards,
Casey Rodarmor
 
Reply With Quote
 
 
 
 
Arnaud Delobelle
Guest
Posts: n/a
 
      10-29-2008
On Oct 29, 7:46*pm, "Casey Rodarmor" <(E-Mail Removed)> wrote:
> Hi All,
>
> I'm trying to use a class as a decorator for another class method, but
> it's giving me a lot of grief. Basically, my problem is with the
> example below:
>
> >>> class decorator:

>
> ... * * def __init__(self, function):
> ... * * * * self.function = function
> ...
> ... * * def __call__(self, *args, **kwargs):
> ... * * * * self.function(*args, **kwargs)
> ...>>> class Foo:
>
> ... * * def __init__(self):
> ... * * * * self.msg = "Hello,"
> ...
> ... * * @decorator
> ... * * def greet(self, name):
> ... * * * * print self.msg, name
> ...>>> foo = Foo()
> >>> foo.greet("Bob")

>
> Traceback (most recent call last):
> * File "<stdin>", line 1, in <module>
> * File "decorate.py", line 6, in __call__
> * * self.function(*args, **kwargs)
> TypeError: greet() takes exactly 2 arguments (1 given)
>
> I'm guessing that using a decorator that returns a class instance
> instead of a function instance has messed up the magic of the dot
> operator, causing it not to bind the foo instance to the self
> argument.
>
> Can anybody shed some light on what's happening here?


When

@decorator
def greet(self, name):
print self.msg, name

is executed, a new decorator object is created whose function
attribute is the function 'greet' above (with two arguments) and the
result is given the name 'greet'.

Later, when

>>> foo = Foo()
>>> foo.greet("Bob")


is executed,

foo.greet is a decorator object whose attribute 'function' is the
plain function 'greet'. So it expects two arguments and you only
provide one.

To fix this you could use the Descriptor protocol. If you don't know
what it is, I suggest you read this:

http://users.rcn.com/python/download/Descriptor.htm

It should give you what you need to get it right.

HTH

--
Arnaud


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: what is the difference between the vb dot net and asp dot net Nathan Sokalski ASP .Net 11 08-14-2009 08:22 PM
Dynamically resize visible text and append dot dot dot (like gmail subject lines.. ) how to question? jawolter@gmail.com Javascript 6 12-12-2005 04:09 PM
volatile struct in dot h vs dot c Christopher M. Lusardi C Programming 3 05-15-2004 12:17 AM
To dot or not to dot? SamuŽl van Laere HTML 8 10-16-2003 02:55 PM



Advertisments