blob: d8e7e5f9280fd1ec104ec31c808a3504defd9c3a [file] [log] [blame]
Tor Norbye1aa2e092014-08-20 17:01:23 -07001'''For debug purpose we are replacing actual builtin property by the debug property
2'''
3from pydevd_comm import GetGlobalDebugger
4from pydevd_constants import * #@UnusedWildImport
5import pydevd_tracing
6
7#=======================================================================================================================
8# replace_builtin_property
9#=======================================================================================================================
10def replace_builtin_property(new_property=None):
11 if new_property is None:
12 new_property = DebugProperty
13 original = property
14 if not IS_PY3K:
15 try:
16 import __builtin__
17 __builtin__.__dict__['property'] = new_property
18 except:
19 if DebugInfoHolder.DEBUG_TRACE_LEVEL:
20 import traceback;traceback.print_exc() #@Reimport
21 else:
22 try:
23 import builtins #Python 3.0 does not have the __builtin__ module @UnresolvedImport
24 builtins.__dict__['property'] = new_property
25 except:
26 if DebugInfoHolder.DEBUG_TRACE_LEVEL:
27 import traceback;traceback.print_exc() #@Reimport
28 return original
29
30
31#=======================================================================================================================
32# DebugProperty
33#=======================================================================================================================
34class DebugProperty(object):
35 """A custom property which allows python property to get
36 controlled by the debugger and selectively disable/re-enable
37 the tracing.
38 """
39
40
41 def __init__(self, fget=None, fset=None, fdel=None, doc=None):
42 self.fget = fget
43 self.fset = fset
44 self.fdel = fdel
45 self.__doc__ = doc
46
47
48 def __get__(self, obj, objtype=None):
49 if obj is None:
50 return self
51 global_debugger = GetGlobalDebugger()
52 try:
53 if global_debugger is not None and global_debugger.disable_property_getter_trace:
54 pydevd_tracing.SetTrace(None)
55 if self.fget is None:
56 raise AttributeError("unreadable attribute")
57 return self.fget(obj)
58 finally:
59 if global_debugger is not None:
60 pydevd_tracing.SetTrace(global_debugger.trace_dispatch)
61
62
63 def __set__(self, obj, value):
64 global_debugger = GetGlobalDebugger()
65 try:
66 if global_debugger is not None and global_debugger.disable_property_setter_trace:
67 pydevd_tracing.SetTrace(None)
68 if self.fset is None:
69 raise AttributeError("can't set attribute")
70 self.fset(obj, value)
71 finally:
72 if global_debugger is not None:
73 pydevd_tracing.SetTrace(global_debugger.trace_dispatch)
74
75
76 def __delete__(self, obj):
77 global_debugger = GetGlobalDebugger()
78 try:
79 if global_debugger is not None and global_debugger.disable_property_deleter_trace:
80 pydevd_tracing.SetTrace(None)
81 if self.fdel is None:
82 raise AttributeError("can't delete attribute")
83 self.fdel(obj)
84 finally:
85 if global_debugger is not None:
86 pydevd_tracing.SetTrace(global_debugger.trace_dispatch)
87
88
89 def getter(self, fget):
90 """Overriding getter decorator for the property
91 """
92 self.fget = fget
93 return self
94
95
96 def setter(self, fset):
97 """Overriding setter decorator for the property
98 """
99 self.fset = fset
100 return self
101
102
103 def deleter(self, fdel):
104 """Overriding deleter decorator for the property
105 """
106 self.fdel = fdel
107 return self
108