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

David Hirschfield davidh at ilm.com
Mon Jun 29 21:01:29 EDT 2009


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.

This simple example illustrates the problem:

import inspect
class swapWith(object):
    def __init__(self, replacement):
        self.replacement = replacement
   
    def __call__(self, thingToReplace):
        def _replacer(*args, **kws):
            import inspect
            print 
"replacing:",self.replacement,inspect.ismethod(self.replacement)
            return self.replacement(*args, **kws)
        return _replacer

class MyClass(object):
   
    def swapIn(self):
        print "this method will be swapped in"

    @swapWith(swapIn)
    def swapOut(self):
        print "this method will be swapped out"

c = MyClass()
c.swapOut()


def swapInFn():
    print "this function will be swapped in"
   
@swapWith(swapInFn)
def swapOutFn():
    print "this function will be swapped out"

swapOutFn()


Both MyClass.swapIn and swapInFn look like the same thing to the 
decorator, and MyClass.swapOut and swapOutFn look the same. So is there 
a pattern I can follow that will allow me to determine whether the 
objects I'm given are plain functions or belong to a class?

Thanks in advance,
-David

-- 
Presenting:
mediocre nebula.





More information about the Python-list mailing list