2016-07-05 6 views
2

Ich möchte Methoden in einer Klasse B dynamisch erstellen, die den gleichen Namen und die 'Schnittstelle' haben (damit meine ich args/kwargs/defaults list) wie die Methoden in Klasse A, aber anderer Code.Wie man eine Funktionsschnittstelle, z.B. f() -> f (a, b, c = 'Standard')

Generische Schnittstellen wie f (* args, ** kwargs) sind nicht wünschenswert.

Das Generieren der Methoden und das dynamische Hinzufügen von Methoden wie setattr (self .__ class__, fa .__ name__, fb), Kopieren von Docstrings usw. ist einfach genug. Aber ich habe keine Möglichkeit gefunden, die 'Schnittstelle' dynamisch zu kopieren. Schreibzugriff auf fb .__ code __. Co_argcount /.co_varnames funktioniert nicht.

Die nächste Lösung, die ich dynamisch gefunden wurde, um die Methoden in einem String erstellen und sie dann auf die jeweilige Kategorie von Anteilen, wie:

code = '''def f(a,b): ...''' 
ns = {} 
exec code in ns 
setattr(self.__class__, 'f', ns['f']) 

Aber ich weiß nicht, wie die Annäherung und viel von einem meiner Methoden bevorzugen Erzeugung würde generische Methode durch dynamische Änderung der Schnittstelle. (Die Überprüfung und Verwendung dieser Schnittstelle innerhalb der Methode ist kein Problem.)

Jeder Weg, das zu tun?

(Use Case: Die Methoden in Klasse B rufen ihre 'Spiegel'-Methoden in Klasse A auf, die in einem anderen Prozess laufen, über ZeroMQ-Messaging und geben dann die Ergebnisse zurück und stellen eine lokale' Spiegel'-Schnittstelle bereit Da es eine große Anzahl verschiedener 'remote' Klassen A1..An geben kann, möchte ich nicht alle entsprechenden Klassen B1..Bn manuell anlegen und pflegen müssen, sondern eine generische Klasse B haben, die sich anpasst sich automatisch an eine beliebige Klasse Ax übergeben.)

Mein erster Beitrag, hoffe das ist einigermaßen klar ... THX!

+0

Wie möchten Sie den tatsächlichen Funktionskörper dynamisch generieren? Sie müssen 'kompilieren' oder etwas, um das trotzdem zu tun, warum also nicht benutzen, um die Signatur zu definieren? – BrenBarn

+0

Ich hoffte, in der Lage zu sein: (1) eine generische Funktion zu deklarieren, die ihre eigene Signatur prüft und verarbeitet, und dann (2) Kopien davon erstellt und ihre Namen und Signaturen so modifiziert, dass sie der Klasse A – BigT

+0

entsprechen ... sie wie auch das schaffen könnte: 'def makeFn (cls, fnName, ** SignatureInfo): def newFn (self): # Allgemein Code handeln basierend auf Selbstkontrolle und/oder ** SignatureInfo setattr (cls, FnName, newFn) ' aber das lässt mich immer noch mit dem Problem der Änderung der Signatur der neuen Funktion – BigT

Antwort

0

Sie können die Signatur einer Funktion nicht ändern, nachdem sie erstellt wurde. Sie müssen tun, was Sie beschreiben. Die Quelle der Bibliothek decorator kann für Sie nützlich sein, da sie einen Mechanismus zum Erstellen einer Funktion mit einer bestimmten Signatur enthält.

+0

Das sollte tun. DANKE! – BigT

Verwandte Themen