Skript dynamisch um Methode/Funktion erweitern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

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
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten