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