56 Stimmen

Erstellung von dynamischen/Laufzeitmethoden (Codegenerierung) in Python

Ich muss Code für eine Methode zur Laufzeit generieren. Es ist wichtig, dass ich beliebigen Code ausführen kann und einen Docstring habe.

Ich habe eine Lösung gefunden, die exec y setattr Hier ist ein Beispiel für einen Dummy:

class Viking(object):
    def __init__(self):
        code = '''
            def dynamo(self, arg):
                """ dynamo's a dynamic method!
                """
                self.weight += 1
                return arg * self.weight
            '''
        self.weight = 50

        d = {}
        exec code.strip() in d
        setattr(self.__class__, 'dynamo', d['dynamo'])

if __name__ == "__main__":
    v = Viking()
    print v.dynamo(10)
    print v.dynamo(10)
    print v.dynamo.__doc__

Gibt es einen besseren / sichereren / idiomatischeren Weg, um das gleiche Ergebnis zu erzielen?

-1voto

desdulianto Punkte 1

Verzeihen Sie mir mein schlechtes Englisch.

Ich muss vor kurzem dynamische Funktion generieren, um jedes Menüelement zu binden, um bestimmte Rahmen auf wxPython zu öffnen. Hier ist, was ich tun.

Zunächst erstelle ich eine Liste von Zuordnungen zwischen dem Menüpunkt und dem Rahmen.

menus = [(self.menuItemFile, FileFrame), (self.menuItemEdit, EditFrame)]

Das erste Element in der Zuordnung ist das Menüelement und das letzte Element ist der zu öffnende Rahmen. Als nächstes binde ich das wx.EVT_MENU-Ereignis von jedem der Menüpunkte an einen bestimmten Rahmen.

for menu in menus:
    f = genfunc(self, menu[1])
    self.Bind(wx.EVT_MENU, f, menu[0])

Die Funktion genfunc ist der dynamische Funktionsersteller, hier der Code:

def genfunc(parent, form):
    def OnClick(event):
        f = form(parent)
        f.Maximize()
        f.Show()
    return OnClick

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X