1515
1616"""Property with logging on successful get/set/delete or failure."""
1717
18+ __all__ = ("LogOnAccess" ,)
19+
1820import logging
1921import sys
2022import traceback
2123import typing
2224
23- __all__ = ("LogOnAccess" ,)
2425
25- _logger = logging .getLogger (__name__ ) # type: logging.Logger
26+ _logger : logging . Logger = logging .getLogger (__name__ )
2627
2728
2829class LogOnAccess (property ):
@@ -47,7 +48,7 @@ def __init__(
4748 log_success : bool = True ,
4849 log_failure : bool = True ,
4950 log_traceback : bool = True ,
50- override_name : typing .Optional [str ] = None
51+ override_name : typing .Optional [str ] = None ,
5152 ) -> None :
5253 """Advanced property main entry point.
5354
@@ -88,7 +89,7 @@ def __init__(
8889 ... def __init__(self, val = 'ok'):
8990 ... self.val = val
9091 ... def __repr__(self):
91- ... return '{cls }(val={self.val})'.format(cls=self.__class__.__name__, self=self)
92+ ... return f'{self.__class__.__name__ }(val={self.val})'
9293 ... @LogOnAccess
9394 ... def ok(self):
9495 ... return self.val
@@ -165,17 +166,17 @@ def __init__(
165166 super (LogOnAccess , self ).__init__ (fget = fget , fset = fset , fdel = fdel , doc = doc )
166167
167168 if logger is None or isinstance (logger , logging .Logger ):
168- self .__logger = logger
169+ self .__logger : typing . Optional [ logging . Logger ] = logger
169170 else :
170171 self .__logger = logging .getLogger (logger )
171172
172- self .__log_object_repr = log_object_repr
173- self .__log_level = log_level
174- self .__exc_level = exc_level
175- self .__log_success = log_success
176- self .__log_failure = log_failure
177- self .__log_traceback = log_traceback
178- self .__override_name = override_name
173+ self .__log_object_repr : bool = log_object_repr
174+ self .__log_level : int = log_level
175+ self .__exc_level : int = exc_level
176+ self .__log_success : bool = log_success
177+ self .__log_failure : bool = log_failure
178+ self .__log_traceback : bool = log_traceback
179+ self .__override_name : typing . Optional [ str ] = override_name
179180
180181 @property
181182 def __traceback (self ) -> str :
@@ -186,18 +187,16 @@ def __traceback(self) -> str:
186187 stack = traceback .extract_stack ()
187188 tb = traceback .extract_tb (exc_info [2 ])
188189 full_tb = stack [:1 ] + tb # cut decorator and build full traceback
189- exc_line = traceback .format_exception_only (* exc_info [:2 ])
190+ exc_line : typing . List [ str ] = traceback .format_exception_only (* exc_info [:2 ])
190191 # Make standard traceback string
191192 tb_text = "\n Traceback (most recent call last):\n " + "" .join (traceback .format_list (full_tb )) + "" .join (exc_line )
192193 return tb_text
193194
194195 def __get_obj_source (self , instance : typing .Any , owner : typing .Optional [type ] = None ) -> str :
195196 """Get object repr block."""
196197 if self .log_object_repr :
197- return "{instance!r}" .format (instance = instance )
198- return "<{name}() at 0x{id:X}>" .format (
199- name = owner .__name__ if owner is not None else instance .__class__ .__name__ , id = id (instance )
200- )
198+ return f"{ instance !r} "
199+ return f"<{ owner .__name__ if owner is not None else instance .__class__ .__name__ } () at 0x{ id (instance ):X} >"
201200
202201 def _get_logger_for_instance (self , instance : typing .Any ) -> logging .Logger :
203202 """Get logger for log calls.
@@ -229,26 +228,17 @@ def __get__(self, instance: typing.Any, owner: typing.Optional[type] = None) ->
229228 if instance is None or self .fget is None :
230229 raise AttributeError ()
231230
232- source = self .__get_obj_source (instance , owner )
233- logger = self ._get_logger_for_instance (instance )
231+ source : str = self .__get_obj_source (instance , owner )
232+ logger : logging . Logger = self ._get_logger_for_instance (instance )
234233
235234 try :
236235 result = super (LogOnAccess , self ).__get__ (instance , owner )
237236 if self .log_success :
238- logger .log (
239- self .log_level ,
240- "{source}.{name} -> {result!r}" .format (source = source , name = self .__name__ , result = result ),
241- )
237+ logger .log (self .log_level , "%s.%s -> %r" , source , self .__name__ , result )
242238 return result
243239 except Exception :
244240 if self .log_failure :
245- logger .log (
246- self .exc_level ,
247- "Failed: {source}.{name}{traceback}" .format (
248- source = source , name = self .__name__ , traceback = self .__traceback
249- ),
250- exc_info = False ,
251- )
241+ logger .log (self .exc_level , "Failed: %s.%s%s" , source , self .__name__ , self .__traceback , exc_info = False )
252242 raise
253243
254244 def __set__ (self , instance : typing .Any , value : typing .Any ) -> None :
@@ -263,22 +253,22 @@ def __set__(self, instance: typing.Any, value: typing.Any) -> None:
263253 if self .fset is None :
264254 raise AttributeError ()
265255
266- source = self .__get_obj_source (instance )
267- logger = self ._get_logger_for_instance (instance )
256+ source : str = self .__get_obj_source (instance )
257+ logger : logging . Logger = self ._get_logger_for_instance (instance )
268258
269259 try :
270260 super (LogOnAccess , self ).__set__ (instance , value )
271261 if self .log_success :
272- logger .log (
273- self .log_level , "{source}.{name} = {value!r}" .format (source = source , name = self .__name__ , value = value )
274- )
262+ logger .log (self .log_level , "%s.%s = %r" , source , self .__name__ , value )
275263 except Exception :
276264 if self .log_failure :
277265 logger .log (
278266 self .exc_level ,
279- "Failed: {source}.{name} = {value!r}{traceback}" .format (
280- source = source , name = self .__name__ , value = value , traceback = self .__traceback
281- ),
267+ "Failed: %s.%s = %r%s" ,
268+ source ,
269+ self .__name__ ,
270+ value ,
271+ self .__traceback ,
282272 exc_info = False ,
283273 )
284274 raise
@@ -294,21 +284,17 @@ def __delete__(self, instance: typing.Any) -> None:
294284 if self .fdel is None :
295285 raise AttributeError ()
296286
297- source = self .__get_obj_source (instance )
298- logger = self ._get_logger_for_instance (instance )
287+ source : str = self .__get_obj_source (instance )
288+ logger : logging . Logger = self ._get_logger_for_instance (instance )
299289
300290 try :
301291 super (LogOnAccess , self ).__delete__ (instance )
302292 if self .log_success :
303- logger .log (self .log_level , "del {source}.{name}" . format ( source = source , name = self .__name__ ) )
293+ logger .log (self .log_level , "del %s.%s" , source , self .__name__ )
304294 except Exception :
305295 if self .log_failure :
306296 logger .log (
307- self .exc_level ,
308- "{source}: Failed: del {name}{traceback}" .format (
309- source = source , name = self .__name__ , traceback = self .__traceback
310- ),
311- exc_info = False ,
297+ self .exc_level , "%s: Failed: del %s%s" , source , self .__name__ , self .__traceback , exc_info = False
312298 )
313299 raise
314300
0 commit comments