lundi 13 juin 2016

How To make decorator get invoked on a recursive function call?

So here's an extension to this question: https://stackoverflow.com/a/37568895/2290820 on how to optionally Enable or Disable Decorator on a Function.

On those lines, I came up with something like this to make decorator get invoked on a recursive call:

def deco(f):
    def fattr(attr):
        f.attr = attr
        def closure(*args):
            f(*args)
        f.unwrap = f
        f.closure = closure
        return f
    return fattr

@deco
def printa(x):
    if x > 1:
        print x
        return printa(x-1)
    else:
        print x
    return

printa({1:1})(5)

# do the same call w/o deocorator
def finta(x):
    if x > 1:
        print x
        return finta(x-1)
    else:
        print x
    return

finta(5) # this works

to experiment with decorators on a recursive function. Clearly, printa recursive version is not behaving the way it should be.

I could do

g = printa({1:1})
g.closure(5)

to turn on the decorator option or not use that option. Anyway, regardless of good or bad design, How can I make decorator get invoked on a recursive call?

Aucun commentaire:

Enregistrer un commentaire