Modify Funktion im Dekorateur

Ich habe darüber nachgedacht, einen Dekorateur zu bauen, um die Leistung zu steigern. Ein Dekorator, der den Quellcode der von ihm dekorierten Funktion ändert und die geänderte Funktion zurückgibt.

Während ich dies durchdachte, stellte ich mir vor, dass ich dies tun könnte, wenn ich nur den Quellcode der Funktion erhalten könnte. Aber ist es möglich, innerhalb eines Dekorateurs auf den Quellcode einer Funktion zuzugreifen? Wenn ich einen Dekorateur wie diesen habe:

import inspect

def decorate(f):
    exec(inspect.getsource(f))
    return eval(f.__name__)

@decorate
def test():
    return 1

Ich erhalte einen OSError:

OSError: could not get source code

Dies scheint zu sein, weiltest ist nicht vollständig gebildet, bevor es an @ übergeben widecorate. Dies funktioniert jedoch:

import inspect

def decorate(f):
    exec(inspect.getsource(f))
    return eval(f.__name__)

def test():
    return 1
test = decorate(test)

Das Flair eines Dekorateurs hat es einfach nicht. Es scheint, dass dies möglich sein könnte, weilf.__code__ ist defined.

Nach weiterer Prüfung scheint es, dass dies nur passiert, wenn ich dasinspect.getsource(f)inexec. Ansonsten scheint es, dass ich den Quellcode bekommen kann.

Als grobe Skizze des ersten Gedankens denke ich an die Schwanzrekursion. Ich habe diesen Dekorateur geschrieben, der leider langsam ist und einen ganz bestimmten Schreibstil für die zu dekorierende Funktion erfordert:

def tail_recurse(acc_default):
    def decorate(f):
        def wrapper(*args, acc=acc_default):
            args = args + (acc,)
            while True:
                return_type, *rargs = f(*args)
                if return_type is None:
                    return rargs[-1]
                args = rargs
        return wrapper
    return decorate

rundsätzlich überlege ich, etwas so Einfaches wie das Ersetzen des Körpers einer Funktion durc

while True:
    __body__
    update_args

Antworten auf die Frage(0)

Ihre Antwort auf die Frage