How to differentiate between method and function in a decorator?
        Posted  
        
            by defnull
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by defnull
        
        
        
        Published on 2010-03-12T20:45:32Z
        Indexed on 
            2010/03/12
            20:47 UTC
        
        
        Read the original article
        Hit count: 232
        
I want to write a decorator that acts differently depending on whether it is applied to a function or to a method.
def some_decorator(func):
    if the_magic_happens_here(func): # <---- Point of interest
        print 'Yay, found a method ^_^ (unbound jet)'
    else:
        print 'Meh, just an ordinary function :/'
    return func
class MyClass(object):
    @some_decorator
    def method(self):
        pass
@some_decorator
def function():
    pass
I tried inspect.ismethod(), inspect.ismethoddescriptor() and inspect.isfunction() but no luck. The problem is that a method actually is neither a bound nor an unbound method but an ordinary function as long as it is accessed from within the class body.
What I really want to do is to delay the actions of the decorator to the point the class is actually instantiated because I need the methods to be callable in their instance scope. For this, I want to mark methods with an attribute and later search for these attributes when the .__new__() method of MyClass is called. The classes for which this decorator should work are required to inherit from a class that is under my control. You can use that fact for your solution.
In the case of a normal function the delay is not necessary and the decorator should take action immediately. That is why I wand to differentiate these two cases.
© Stack Overflow or respective owner