1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| #!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# class myvar for jlg_47
# http://www.developpez.net/forums/d915461/autres-langages/python-zope/general-python/crash-aleatoire-thread/
# Based on Tkinter variable class
import inspect
import sys
class myvar(object):
_default = ""
def __init__(self, master=None, value=None, name=None, trace=None, mode=None):
if not master:
self._master = self
self._master = master
if value is not None:
self._value=value
else:
self._value=self._default
if trace:
self._trace=trace
else:
self._trace=None
if mode:
self._mode=mode
else:
self._mode=None
self._oldmode=None
self._oldtrace=None
if name:
self._name = name
print inspect.stack()[1][3]
print sys._getframe(1).f_code.co_name
else:
self._name = str(inspect.stack()[1][4]).partition('=myvar(')[0][2:].replace(' ', '').replace('self.', '')
# Oui, c'est moche. Donc TODO mais plus tard.
globals()[self._name] = self
def __str__(self):
return str(self._name)
def set(self, value):
self._value=value
if self._trace is not None and (self._mode == 'u' or self._mode == 'w'):
self.savetrace()
self._oldtrace()
elif self._oldtrace is not None:
self.restauretrace()
def get(self):
if self._trace is not None and (self._mode == 'u' or self._mode == 'r'):
self.savetrace()
self._oldtrace()
elif self._oldtrace is not None:
self.restauretrace()
return self._value
def trace_variable(self, mode, callback):
self._mode=mode
self._trace=callback
trace = trace_variable
def trace_vdelete(self):
self._mode=None
self._trace=None
def trace_vinfo(self):
return self._mode, self._trace
def varinfo(self):
return "Master", self._master, "Name", self._name, "Value", str(self._value), "Trace callback", self._trace, "Trace mode", self._mode
# TODO For callback recursion
def restauretrace(self):
self._trace=self._oldtrace
self._mode=self._oldmode
self._oldtrace=None
self._oldmode=None
def savetrace(self):
self._oldtrace=self._trace
self._oldmode=self._mode
self._trace=None
self._mode=None
if __name__ == "__main__":
a=myvar()
# Set a value
a.set(10)
# trace value
def callback():
b=myvar(name='b')
print 'locals >', locals()
a.trace('u', callback)
a.set(20)
print 'globals >', globals() |
Partager