[Python-de] Einklinken beim Zugriff auf eine bestimmte Variable

Christian Junker christianjunker at gmail.com
Mit Sep 21 10:16:26 CEST 2005


Hi Stefan,

Am 11.09.05 schrieb Stefan Schwarzer <sschwarzer at 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