Determining if a function is a method of a class within a decorator

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Mon Jun 29 22:25:24 EDT 2009


On Mon, 29 Jun 2009 18:01:29 -0700, David Hirschfield wrote:

> I'm having a little problem with some python metaprogramming. I want to
> have a decorator which I can use either with functions or methods of
> classes, which will allow me to swap one function or method for another.
> It works as I want it to, except that I want to be able to do some
> things a little differently depending on whether I'm swapping two
> functions, or two methods of a class.
>
> Trouble is, it appears that when the decorator is called the function is
> not yet bound to an instance, so no matter whether it's a method or
> function, it looks the same to the decorator.

Then:

* use a naming convention to recognise methods (e.g. check if the first 
argument is called "self" by looking at function.func_code.co_varnames);

* use two different decorators, or a decorator that takes an extra 
"method or function argument";

* play around with the class metaclass and see if you can do something 
special (and probably fragile);

* do the replacements after the class is created without decorator 
syntax, e.g.:

Class.method1 = swapWith(Class.method2)(Class.method1)



 
> This simple example illustrates the problem:
[snip]


No it doesn't. It appears to work perfectly, from what I can guess you're 
trying to accomplish.



Have you considered a possibly simpler way of swapping methods/functions?


>>> def parrot():
...     print "It's pining for the fjords."
...
>>> def cheeseshop():
...     print "We don't stock Cheddar."
...
>>> parrot, cheeseshop = cheeseshop, parrot
>>>
>>> parrot()
We don't stock Cheddar.
>>> cheeseshop()
It's pining for the fjords.


Admittedly, this doesn't let you do extra processing before calling the 
swapped functions, but perhaps it will do for what you need.



-- 
Steven



More information about the Python-list mailing list