22import os
33import platform
44import sys
5+ import functools
56
67global_instrumenter = None
78
@@ -74,13 +75,29 @@ class enable():
7475 If a region name is given, the region the contextmanager is active will be marked in the trace or profile
7576 """
7677
77- def __init__ (self , region_name = None ):
78+ def __init__ (self , region_name = "" ):
7879 self .region_name = region_name
80+ if region_name == "" :
81+ self .user_region_name = False
82+ else :
83+ self .user_region_name = True
84+ self .module_name = ""
85+
86+ def _recreate_cm (self ):
87+ return self
88+
89+ def __call__ (self , func ):
90+ with disable ():
91+ @functools .wraps (func )
92+ def inner (* args , ** kwds ):
93+ with self ._recreate_cm ():
94+ return func (* args , ** kwds )
95+ return inner
7996
8097 def __enter__ (self ):
8198 self .tracer_registered = get_instrumenter ().get_registered ()
8299 if not self .tracer_registered :
83- if self .region_name :
100+ if self .user_region_name :
84101 self .module_name = "user_instrumenter"
85102 frame = inspect .currentframe ().f_back
86103 file_name = frame .f_globals .get ('__file__' , None )
@@ -96,11 +113,11 @@ def __enter__(self):
96113
97114 get_instrumenter ().register ()
98115
99- def __exit__ (self , exc_type , exc_value , traceback ):
116+ def __exit__ (self , exc_type = None , exc_value = None , traceback = None ):
100117 if not self .tracer_registered :
101118 get_instrumenter ().unregister ()
102119
103- if self .region_name is not None :
120+ if self .user_region_name :
104121 get_instrumenter ().region_end (
105122 self .module_name , self .region_name )
106123
@@ -116,15 +133,35 @@ class disable():
116133 If a region name is given, the region the contextmanager is active will be marked in the trace or profile
117134 """
118135
119- def __init__ (self , region_name = None ):
136+ def __init__ (self , region_name = "" ):
120137 self .region_name = region_name
138+ if region_name == "" :
139+ self .user_region_name = False
140+ else :
141+ self .user_region_name = True
142+ self .module_name = ""
143+ self .func = None
144+
145+ def _recreate_cm (self ):
146+ return self
147+
148+ def __call__ (self , func ):
149+ self .__enter__ ()
150+ try :
151+ @functools .wraps (func )
152+ def inner (* args , ** kwds ):
153+ with self ._recreate_cm ():
154+ return func (* args , ** kwds )
155+ finally :
156+ self .__exit__ ()
157+ return inner
121158
122159 def __enter__ (self ):
123160 self .tracer_registered = get_instrumenter ().get_registered ()
124161 if self .tracer_registered :
125162 get_instrumenter ().unregister ()
126163
127- if self .region_name is not None :
164+ if self .user_region_name :
128165 self .module_name = "user_instrumenter"
129166 frame = inspect .currentframe ().f_back
130167 file_name = frame .f_globals .get ('__file__' , None )
@@ -138,9 +175,9 @@ def __enter__(self):
138175 self .module_name , self .region_name , full_file_name ,
139176 line_number )
140177
141- def __exit__ (self , exc_type , exc_value , traceback ):
178+ def __exit__ (self , exc_type = None , exc_value = None , traceback = None ):
142179 if self .tracer_registered :
143- if self .region_name is not None :
180+ if self .user_region_name :
144181 get_instrumenter ().region_end (
145182 self .module_name , self .region_name )
146183
0 commit comments