[Python-de] Bei der Instantiierung einer Funktion Code ausführen

Mike Müller mmueller at python-academy.de
Sa Dez 8 11:35:05 CET 2012


Hallo Albert,

Am 08.12.12 10:40, schrieb Albert Hermeling:
> Guten Morgen,
> 
> ich Beschäftige mich gerade mit mit den Internas von Python Funktionen. Beim
> Nachdenken über Funktionen, habe ich mich gefragt, ob man Code beim erzeugen
> einer Funktion unbemerkt ausführen kann. Klinkt jetzt ein bisschen verworren,
> deshalb hier ein Beispiel:
> 
> s = """
> def printer():
>     print("Böse Funktion: ", dir())
> """
> 
> Diese Funktion liegt als String vor und wenn ich jetzt aus dem String mit exec
> eine Funktion erzeuge (Instantiiere (?)) habe ich eine Funktion printer im
> aktuellen Namensraum. So lange ich diese Funktion nicht aufrufe, passiert
> nichts, rufe ich Sie auf passiert was. Ist es jetzt eigentlich möglich, das bei
> der Erzeugung (exec(s) genau jetzt), also noch vor dem Aufrufen der selbigen,
> Schadcode ausgeführt werden kann?

Die Funktion wird erst beim Aufruf ausgeführt. Kannst aber garantieren, dass
nicht auch außerhalb der Funktion Anweisungen kommen? Zum Beispiel:

s = """
print('haha')
def printer():
     print("Böse Funktion: ", dir())
"""

Generell würde ich `exec` nur in sehr seltenen Fällen nehmen. Es gibt fast
immer eine andere, oft bessere, Lösung. Kannst du mal kurz erklären warum
die Funktion als String vorliegt und was genau passieren soll. Dann bietet
sich vielleicht eine andere Lösung an.

Viele Grüße
Mike



Mehr Informationen über die Mailingliste python-de