NEB
NEB

Reputation: 734

Python: Calling decorator inside a function

Trying to understand decorator. So, is it possible to call decorator inside a function, either by defining the function inline or independently ?

def deco(f):
    print "In deco"
    def wrp(*args, **kwargs):
        print "In wrp"
        return f(*args, **kwargs)
    return wrp

@deco
def f1():
    print "In f1"

def f2():
    print "In f2"

def f3():
    print "In f3"
    # Calling independent function
    # Error : Invalid syntax error
    @deco
    f2()
    '''
    @deco
        f2()
    Error : IndentationError: unexpected indent
    '''
    print "End f3"

def f4():
    print "In f4"
    # Making function inline
    @deco
    def f5():
        print "In f5"
    '''
    Error : NameError: global name 'deco' is not defined
    '''
    print "End f4"

Also, explanation for error in f4() will be helpful.

Upvotes: 1

Views: 5434

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599580

I'm not quite sure what you are trying to do here. The @ is simply syntactic sugar for wrapping a function in another one: so @deco before the definition of f1 is exactly the same as f1 = deco(f1) afterwards.

So it simply doesn't make sense to "use" a decorator inside another function. If you really wanted to, you could do this:

deco(f2)()

ie, create the wrapper and then call it, but I have no idea why you would want to do that.

Upvotes: 3

Related Questions