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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
| #!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
#
import traceback
import sys
class IndexStorage():
"""Generic storage class"""
varnum = 0
class VarClass(object):
# Class Varclass
# Test sys/traceback code inspection
# http://www.developpez.net/forums/d1023748/autres-langages/python-zope/general-python/recuperer-nom-variable-fonction-classe/
# options:
# master: parent Widget
# value: Instance value (Variable or object)
# name: Instance name in globals() namespace
# trace: Callback function/class
# mode: Callback mode (w/r/u)
# Methods:
# set(value)
# get()
# trace_variable(mode, callback) / trace(mode, callback)
# trace_vdelete() Delete callback
# trace_vinfo() Return callback informations
# varinfo() Retrun instance informations
# type() Return the type
_default = ""
def __init__(self, master=None, value=None, name=None, trace=None, mode=None):
if not master:
master = self
self._master = master
if value is not None:
self._value=value
else:
self._value=self._default
self._type=type(self._value)
if trace:
self._trace=trace
else:
self._trace=None
if mode:
self._mode=mode
else:
self._mode=None
if name:
self._name = name
else:
try:
_longname = traceback.extract_stack(limit=2)[0][3].split('=')[0].strip()
_shortname = _longname.split('.').pop()
if '()' in _shortname:
self._noname()
else:
self._name = _shortname
except:
self._noname()
globals()[self._name] = self
def _noname(self):
self._name = 'PY_VAR' + repr(IndexStorage.varnum)
IndexStorage.varnum += 1
def __str__(self):
return self._name
def set(self, value):
self._value=value
if self._trace is not None and (self._mode == 'u' or self._mode == 'w') and sys._getframe().f_back.f_code.co_name != self._trace.__name__:
self._trace()
def get(self):
if self._trace is not None and (self._mode == 'u' or self._mode == 'r') and sys._getframe().f_back.f_code.co_name != self._trace.__name__:
self._trace()
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 trace_value(self, valuetrace, callback):
self._valuetrace=callback
tracev = trace_value
def trace_valdelete(self):
self._tracev=None
def trace_valinfo(self):
return self._valuetrace, self._trace
#
def varinfo(self):
# Return the tuple (Master, Name, Value, Type, Trace callback, Trace mode)
return self._master, self._name, self._value, self._type, self._trace, self._mode
def type(self):
return self._type
def test():
print('Class test --------------------------------------------------------')
print('Set a=VarClass()')
a=VarClass()
# Default value = ""
print('a value after a=VarClass():', a.get())
# Set a value
a.set(10)
print('-------------------------------------------------------------------')
# Get the value
print('Value after a a.set(10):', a.get())
print('-------------------------------------------------------------------')
print('Trace test:')
def callback():
print('a in callback:', a.get())
print('a.set(30) in callback')
a.set(30)
a.trace('u', callback)
a.set(20)
# Callback informations
print('Callback informations:', a.trace_vinfo())
# Delete callback
a.trace_vdelete()
print('a.trace_vinfo() after callback deletion:', a.trace_vinfo())
print('a after callback:', a.get())
print('-------------------------------------------------------------------')
VarClass(name='b', value=10)
# Variable informations
print('Variable informations:')
print('var.varinfo():', b.varinfo())
print('var.type():', b.type())
print('-------------------------------------------------------------------')
print('globals()/locals() test:')
def testglobals():
VarClass(name='c')
c.set('A')
print('c in locals():', c.get(), c)
testglobals()
print('c in globals():', c.get(), c)
print('-------------------------------------------------------------------')
print('Name test:')
print('d=VarClass()')
d=VarClass()
print('d name:', d.varinfo()[1])
VarClass(name='e')
print("VarClass(name='e'):", e.varinfo()[1])
VarClass()
print('VarClass():', globals()['PY_VAR0'])
print('-------------------------------------------------------------------')
if __name__ == "__main__":
test() |
Partager