2012-03-29 7 views
0

Ich hatte eine Idee über ein Framework für die Datenflussauswertung mit verzögerter Ausführung. Ich denke, ich brauche Metaklassen dafür, aber ich weiß noch nicht viel über sie. Vielleicht haben Sie schon eine Idee, ob das Folgende funktioniert.Metaklassen für Lazy-Datenfluss-System in Python

Ich würde gerne normale Programme schreiben und lediglich durch Ableiten von Objekten aus einer Metaklasse möchte ich eine faule Auswertung einführen. Deshalb

a=A() 
b=B() 
c=C(a,b) 
d=D(a) 
if input()=="c": 
    print(c.result) 
else: 
    print(d.result) 

All würde Ich mag, dies zu tun zu machen faul ausgewertet (dh für die Eingabe = „c“ nur A, B, C wird ausgeführt und für die Eingabe = „d“ nur A, werden D sein ausgeführt) soll A, B, C, D aus meiner Metaklasse ableiten.

Ich habe über die Änderung __new__ nachgedacht, so dass es ein Proxy-Objekt zurückgibt, das tatsächlich __init__ nicht ausführt. Nur bei Attributzugriff wird __init__ ausgeführt und alle Attributzugriffe werden weitergeleitet.

Darüber hinaus sollte dieses Proxy-Objekt eine Klassenmethode haben, die im Voraus überprüfen kann, bevor das reale Objekt tatsächlich __init__ -ing, ob die Init-Parameter gültig sind (Datenquellen). Tatsächlich möchte ich den Dataflow-Abhängigkeitsgraphen drucken, ohne die Objekte bereits zu laden.

Schließlich, als das letzte kleine Extra, möchte ich Abhängigkeitsverfolgung in meinen Daten einführen. Alle Objektmethoden sollten ihre Argumente magisch untersuchen und das Rückgabeergebnis der Methode (wenn es sich um eine "normale Klasse" handelt, in der ich Attribute setzen kann) durch einen Verweis auf alle Eingabeargumente bereichern. Auf diese Weise kann ich immer nachvollziehen, was in einigen endgültigen Daten eine Rolle gespielt hat.

Denkst du, dass das möglich ist oder hast du vielleicht bereits Hinweise, wie das funktionieren könnte? Vor allem der letzte Teil, über den ich mir nicht sicher bin.

+0

(a) Dies ist möglich (b) Diese Frage vage und offen. Niemand wird dein System für dich entwerfen. Lesen Sie etwas von der Literatur und kommen Sie mit einer Frage zurück, die zumindest ein wenig Betonung hat. – Marcin

+1

überprüfen Greenspuns Zehnte Regel der Programmierung: http://c2.com/cgi/wiki?GreenspunsTenthRuleOfProgramming –

+2

@Gerenuk Oder eigentlich könnte es nur deine Schuld sein, und Sie sind zu faul, eine richtige Frage zu schreiben, weshalb die nur die Antwort sagt dir auch, dass diese Frage nicht konkret genug ist. – Marcin

Antwort

1

Sie können Ihr System auf dem __call__ Attribut basieren. Dann wird Ihr Beispiel betragen:

a=A() 
b=B() 
c=C(a,b) 
d=D(a) 
if input()=="c": 
    print(c()) 
else: 
    print(d()) 

Mit dem Akt der Aufruf Bedeutung zu bewerten. Du könntest aber auch einfach eine Methode * lazy_evaluate() * haben.

Sie werden feststellen, dass die genauere Angabe Ihres Systems Ihnen helfen wird. Schreibe eine funktionale Spezifikation. Was Sie in Ihrer Frage haben, ist keine funktionale Spezifikation. Du hast das nicht genug durchdacht.