Seite 1 von 1

Skript dynamisch um Methode/Funktion erweitern

Verfasst: Mittwoch 19. März 2008, 12:01
von Piet Lotus
Hallo Leute,
ich experimentiere gerade ein wenig mit Python und seinen dynamischen, bzw. generischen Fähigkeiten herum. Da bin ich auf eine Frage gestoßen, die ich durch Internetsuche oder Ausprobieren noch nicht gelöst habe.

Ist es möglich ein Python-Skript dynamisch zur Laufzeit um Funktionen/Methoden zu erweitern, die noch nicht definiert sind? Ich möchte also keine Funktion/Methode aus einem anderen Skript anziehen und ausführen, sondern zur Laufzeit generisch Funktionen/Methoden zum Skript hinzufügen.
Prinzipiell, sowas wie

Code: Alles auswählen

eval('def test(): print "Bin in test()!"')
test()
Geht sowas? Und wenn ja, wie?

Ich danke für Hilfe und schon mal frohe Ostern,
Piet

Verfasst: Mittwoch 19. März 2008, 12:06
von helduel
Moin,

schau dir mal das Module 'new' an. Da kannst du sowas machen - scheint aber im Falle von Funktionen nicht so trivial zu sein.

Gruß,
Manuel

Verfasst: Mittwoch 19. März 2008, 13:17
von keppla

Code: Alles auswählen

exec "def test(): print 'test'"
test()
geht. Da du experimentierst, muss man vermutlich nicht erwähnen, dass sowas... irgendwie... FALSCH ist.

Verfasst: Mittwoch 19. März 2008, 14:23
von Piet Lotus
Hallo,
danke helduel,
ich habe deinen Tipp mal weiterverfolgt mit dem new-Modul geht's wohl so
(ungefähr)

Code: Alles auswählen

import new

methodendefinition = '''
def test():
    print "Bin in test()"
'''

methode = compile(methodendefinition,'<string>','exec')
new.function(methode,globals(),'test')

test()
Der Code gibt wie gewünscht 'Bin in test()' aus...

Danke keppla,
das mit dem exec hatte ich ebenfalls probiert, mich aber in den Versuchen so verstrickt, dass da wohl ein ganz dummer Fehler in die Methodendefinition reingekommen ist, den ich nicht gesehen habe... :(

Dann kann ich ja weiter forschen :) ,
Piet

Verfasst: Donnerstag 20. März 2008, 10:27
von sma
In Python 2.5 scheint "new" deprecated zu sein, man sollte lieber direkt Exemplare der entsprechenden Typen erzeugen, also z.B. `types.FunctionType` benutzen. Mehr - außer umbenennen - macht "new" auch nicht.

Stefan