- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
import traceback
class Watcher(object):
def __init__(self, obj=None, attr=None, log_file='log.txt', include=[], enabled=False):
"""
Debugger that watches for changes in object attributes
obj - object to be watched
attr - string, name of attribute
log_file - string, where to write output
include - list of strings, debug files only in these directories.
Set it to path of your project otherwise it will take long time
to run on big libraries import and usage.
"""
self.log_file=log_file
with open(self.log_file, 'wb'): pass
self.prev_st = None
self.include = [incl.replace('\\','/') for incl in include]
if obj:
self.value = getattr(obj, attr)
self.obj = obj
self.attr = attr
self.enabled = enabled # Important, must be last line on __init__.
def __call__(self, *args, **kwargs):
kwargs['enabled'] = True
self.__init__(*args, **kwargs)
def check_condition(self):
tmp = getattr(self.obj, self.attr)
result = tmp != self.value
self.value = tmp
return result
def trace_command(self, frame, event, arg):
if event!='line' or not self.enabled:
return self.trace_command
if self.check_condition:
if self.prev_st:
with open(self.log_file, 'ab') as f:
print >>f, "Value of",self.obj,".",self.attr,"changed!"
print >>f,"###### Line:"
print >>f,''.join(self.prev_st)
if self.include:
fname = frame.f_code.co_filename.replace('\\','/')
to_include = False
for incl in self.include:
if fname.startswith(incl):
to_include = True
break
if not to_include:
return self.trace_command
self.prev_st = traceback.format_stack(frame)
return self.trace_command
import sys
watcher = Watcher()
sys.settrace(watcher.trace_command)
Говнокод. А ваш стиральный порошок хаскель умеет сам себя дебажить?
LispGovno 16.11.2012 09:25 # 0
bormand 16.11.2012 09:34 # +3
Ты не знаешь, что такое ад зависимостей? Тогда собери hedge wars! Только здесь гуй перед игрой на qt, движок на паскале с sdl, а сервер на хаскеле.
TarasB 16.11.2012 09:45 # 0
bormand 16.11.2012 09:53 # +1
Но что-то он сегодня дохлый.
TarasB 16.11.2012 10:30 # +5
eth0 16.11.2012 11:53 # +1
bormand 16.11.2012 11:57 # +1
eth0 16.11.2012 16:58 # +4
Vindicar 16.11.2012 14:25 # 0
Говным-говно...
serpinski 16.11.2012 17:15 # +1
Vindicar 17.11.2012 12:19 # 0
Надо сбросить состояние объекта в нескольких местах - вынеси в отдельный не-магический метод с осмысленным названием, и вызывай его.
anonimb84a2f6fd141 12.06.2013 20:51 # 0
anonimb84a2f6fd141 12.06.2013 20:50 # 0
Fai 16.11.2012 18:04 # +2
Агрс кваргс шмаргс.
guest 29.01.2013 23:47 # 0
anonimb84a2f6fd141 12.06.2013 20:48 # 0
Категорически не надо использовать в качестве значения по умолчанию изменяемый обьект, т.к. он будет синглтоном.
anonimb84a2f6fd141 12.06.2013 21:02 # 0