Einklinken beim Zugriff auf eine bestimmte Variable

Hallo miteinander, letztens hatte ich die Diskussion mit einem Kollegen welche Sprache mächtiger ist: Tcl oder Python. Da ich Tcl zuvor nur vom Hörensagen kannte, und nichts weiter wusste als dass in Tcl alle Variablen Strings sind, war ich sehr überrascht als dieser mir zeigte wie elegant manche Dinge gemacht werden konnten. Jedenfalls fand ich den Tcl 'trace' Befehl unglaublich bemerkenswert, der es u.a. möglich macht das Verhalten einer Variablen in bestimmten Situationen komplett zu steuern, und zwar indirekt. Man kann z.B. eine Funktion schreiben die immer dann ausgeführt wird, wenn diese eine Variable (die vorher natürlich bekannt sein muss, also zuvor definiert sein muss) irgendwo eingelesen wird. D.h. muss ein Statement die Variable x - oder besser deren Value - lesen, so wird direkt vor dieser Operation die mit trace registrierte selbst geschriebene Funktion aufgerufen, die dann z.B. eine Warnung nach stdout ausspucken kann. Ein Vergleichsfeature in Python fiel mir daraufhin nicht ein, ich hatte nur die spezielle Methode __getattr__ im Kopf und den property(...) Mechanismus, aber das Problem bei ihnen ist, dass sie 1.) nicht eine bestimmte Variable unter die Lupe nehmen können und 2.) nur für Attribute einer Klasse gelten. Gibt es überhaupt soetwas in Python und wenn ja wie heißt die Funktion dazu? (ich hoffe, ich habe nichts offensichtliches übersehen) -- Best Regards Christian Junker _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

hallo liste, gibt es eine möglichkeit, aus python heraus den speicher abzufragen, den der pythoninterpreter alloziert hat? sven. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Monday, 29. August 2005 11:54 schrieb sven:
hallo liste, gibt es eine möglichkeit, aus python heraus den speicher abzufragen, den der pythoninterpreter alloziert hat?
Systemunabhaengig afaik nicht, unter linux zb mit os.getpid() die eigene pid abfragen, und dann /proc/<pid>/status einlesen und parsieren (ist simpel) MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Da ich Tcl zuvor nur vom Hörensagen kannte, und nichts weiter wusste als dass in Tcl alle Variablen Strings sind, war ich sehr überrascht als dieser mir zeigte wie elegant manche Dinge gemacht werden konnten. Jedenfalls fand ich den Tcl 'trace' Befehl unglaublich bemerkenswert, der es u.a. möglich macht das Verhalten einer Variablen in bestimmten Situationen komplett zu steuern, und zwar indirekt. Man kann z.B. eine Funktion schreiben die immer dann ausgeführt wird, wenn diese eine Variable (die vorher natürlich bekannt sein muss, also zuvor definiert sein muss) irgendwo eingelesen wird.
D.h. muss ein Statement die Variable x - oder besser deren Value - lesen, so wird direkt vor dieser Operation die mit trace registrierte selbst geschriebene Funktion aufgerufen, die dann z.B. eine Warnung nach stdout ausspucken kann.
Ein Vergleichsfeature in Python fiel mir daraufhin nicht ein, ich hatte nur die spezielle Methode __getattr__ im Kopf und den property(...) Mechanismus, aber das Problem bei ihnen ist, dass sie 1.) nicht eine bestimmte Variable unter die Lupe nehmen können und 2.) nur für Attribute einer Klasse gelten.
Gibt es überhaupt soetwas in Python und wenn ja wie heißt die Funktion dazu? (ich hoffe, ich habe nichts offensichtliches übersehen)
nicht das ich wuesste. Ob dieses Feature aber die Frage nach der Sprachueberlegenheit beantwortet - das halte ich doch fuer uebetrieben. AFAIK kennt TCL keine Objekte, der Verzicht auf starke typisierung ist auch ein Manko, und zB mehrdimensionale dicts lassen sich nur ueber composite-keys machen - also zb "1x2", als string! Echte listen gibt's auch nicht, sondern eben dicts die mit Zahlen indiziert sind... usw. Alles in allem doch eine deutlich primitivere Sprache. MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Montag, 29. August 2005 00:07 schrieb Christian Junker:
Hallo miteinander,
letztens hatte ich die Diskussion mit einem Kollegen welche Sprache mächtiger ist: Tcl oder Python.
Da ich Tcl zuvor nur vom Hörensagen kannte, und nichts weiter wusste als dass in Tcl alle Variablen Strings sind, war ich sehr überrascht als dieser mir zeigte wie elegant manche Dinge gemacht werden konnten. Jedenfalls fand ich den Tcl 'trace' Befehl unglaublich bemerkenswert, der es u.a. möglich macht das Verhalten einer Variablen in bestimmten Situationen komplett zu steuern, und zwar indirekt. Man kann z.B. eine Funktion schreiben die immer dann ausgeführt wird, wenn diese eine Variable (die vorher natürlich bekannt sein muss, also zuvor definiert sein muss) irgendwo eingelesen wird.
D.h. muss ein Statement die Variable x - oder besser deren Value - lesen, so wird direkt vor dieser Operation die mit trace registrierte selbst geschriebene Funktion aufgerufen, die dann z.B. eine Warnung nach stdout ausspucken kann.
schau dir mal sys.settrace(func) an..
Ein Vergleichsfeature in Python fiel mir daraufhin nicht ein, ich hatte nur die spezielle Methode __getattr__ im Kopf und den property(...) Mechanismus, aber das Problem bei ihnen ist, dass sie 1.) nicht eine bestimmte Variable unter die Lupe nehmen können und 2.) nur für Attribute einer Klasse gelten.
Gibt es überhaupt soetwas in Python und wenn ja wie heißt die Funktion dazu? (ich hoffe, ich habe nichts offensichtliches übersehen)
Hmm, eine Sprache nach Implementierungsdetails (hier den trace Möglichkeiten) zu beurteilen, kommt mir so vor, wie ein Fahrrad nach der Anzahl der Speichen einzuordnen.. Pete _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Christian, On 2005-08-29 00:07, Christian Junker wrote:
Ein Vergleichsfeature in Python fiel mir daraufhin nicht ein, ich hatte nur die spezielle Methode __getattr__ im Kopf und den property(...) Mechanismus, aber das Problem bei ihnen ist, dass sie 1.) nicht eine bestimmte Variable unter die Lupe nehmen können und 2.) nur für Attribute einer Klasse gelten.
es ist immerhin möglich, __getattr__/__setattr__ für eine Klasse zu definieren und diese bzw. Instanzen davon in sys.modules einzubinden (siehe Rezept von Alex Martelli: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65207 ). Deiner Frage nach suchst du nach einer Verallgemeinerung von Alex's Rezept. Wie andere aber schon sagten: Dass eine entsprechende Funktionalität in Python nicht direkt verfügbar ist, muss kein Nachteil sein. Viele Grüße Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hi Stefan, Am 11.09.05 schrieb Stefan Schwarzer <sschwarzer@sschwarzer.net>:
[...] es ist immerhin möglich, __getattr__/__setattr__ für eine Klasse zu definieren und diese bzw. Instanzen davon in sys.modules einzubinden (siehe Rezept von Alex Martelli: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65207 ). Deiner Frage nach suchst du nach einer Verallgemeinerung von Alex's Rezept.
danke vielmals, mit Hilfe dieses Beispiels habe ich mal ein kleines Code Snippet geschrieben, dass mir zumindest bei Modulattributen - u. a. Variablen, die an ein Modul gebunden sind - etwas ähnliches wie das Tcl trace erlaubt. Das folgende könnte in einer trace.py stehen: <code> class _Trace: _vars = {} def __setattr__(self,name,val): #here: call some global function to keep track of write-access to a variable self.__class__._vars[name] = val def __getattr__(self, name): #here: call some global function to keep track of read-access to a variable return self.__class__._vars.get(name, None) import sys sys.modules[__name__]= _Trace() </code> Da kann man sicherlich noch sehr viel verbessern, aber zumindest erfüllt es den Zweck *teilweise*: Eine vergleichbare Tcl trace Funktionalität in purem Python. Die Einschränkung, dass es nur für Variablen in einem bestimmten Modul gilt (hier das Modul mit dem Namen "trace"), ist wahrscheinlich auch noch zu lösen.... -- Best Regards Christian Junker _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Da kann man sicherlich noch sehr viel verbessern, aber zumindest erfüllt es den Zweck *teilweise*: Eine vergleichbare Tcl trace Funktionalität in purem Python. Die Einschränkung, dass es nur für Variablen in einem bestimmten Modul gilt (hier das Modul mit dem Namen "trace"), ist wahrscheinlich auch noch zu lösen....
Wesentlich einfacher und besser wäre es den TCL-Knoten in deinem Kopf zu lösen - dann brauchst du das nicht mehr :) Jede Sprache hat so ihre idiome, und man gewöhnt sich schnell daran und glaubt sie nicht mehr missen zu können - aber es ist immer ein Fehler, andere Idiome mit gewalt in eine andere Sprache zu zerren.... Was du erreicht hast ist ja letztlich auch keine Modul-Leve-Unterstützung (das geht nicht, ich hatte auch mal vorgeschlagen __setattr__/__getattr__ auf Modullevel einzuführen), sondern ein reines Namensraumspielchen. Womit nicht wirklich was gewonnen wäre - denn statt deines komplexen Ansatzes kann man ja auch einfach name = module.Trace() machen und eben alles über name.* aufrufen. Nur innerhalb eines Moduls selber wäre das interessant - aber genau da versagt auch dein Trick. MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (5)
-
Christian Junker
-
Diez B. Roggisch
-
Hans-Peter Jansen
-
Stefan Schwarzer
-
sven