Ich habe überlegt, einen Dekorateur zu machen, um die Leistung zu erhöhen. Ein Decorator, der den Quellcode der Funktion, die er dekoriert, ändert und die geänderte Funktion zurückgibt.Funktion im Dekorateur ändern
Während ich darüber nachdachte, dachte ich, wenn ich nur den Quellcode der Funktion bekommen könnte, könnte ich das machen. Aber ist es möglich, innerhalb eines Decorators auf den Quellcode einer Funktion zuzugreifen? Wenn ich einen Dekorateur wie diese:
import inspect
def decorate(f):
exec(inspect.getsource(f))
return eval(f.__name__)
@decorate
def test():
return 1
Ich erhalte eine OSError:
OSError: could not get source code
Dies scheint zu sein, weil test
nicht vollständig ausgebildet, bevor sie in decorate
geleitet wird. Dies funktioniert jedoch:
import inspect
def decorate(f):
exec(inspect.getsource(f))
return eval(f.__name__)
def test():
return 1
test = decorate(test)
Es hat einfach nicht, dass Dekorateur Flair, obwohl. Es scheint, dass dies möglich ist, weil f.__code__
definiert ist.
Bei einer weiteren Untersuchung scheint es, dass dies nur geschieht, wenn ich die inspect.getsource(f)
in exec
setzen. Ansonsten scheint es, dass ich den Quellcode bekommen kann.
Als eine grobe Skizze der ersten Sache, die in meinem Kopf ist, denke ich an Tail-Rekursion. Ich schrieb dieses Dekorateur, die leider langsam und erfordert eine sehr spezielle Art von der Funktion Schreiben dekoriert werden:
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
Grundsätzlich denke ich an mit etwas so einfaches wie Ersetzen der Körper einer Funktion zu tun:
while True:
__body__
update_args
ast ist wahrscheinlich besser geeignet für das, was Sie wollen –
Lassen Sie eine Zeile leer vor 'exec (inspect.getsource (f))' und es wird funktionieren. Interessant!! –
@AshwiniChaudhary Das tut nichts für mich .... Aber dies führt mich zu der Annahme, dass dies ein Problem mit der Parallelität sein könnte, oder Implementierung abhängig – Justin