1515
1616"""Property with logging on successful get/set/delete or failure."""
1717
18+ from __future__ import annotations
19+
1820# Standard Library
1921import inspect
2022import logging
2830from logwrap import constants
2931from logwrap import repr_utils
3032
33+ if typing .TYPE_CHECKING :
34+ # Standard Library
35+ from collections .abc import Callable
36+
3137__all__ = ("LogOnAccess" ,)
3238
3339_LOGGER : logging .Logger = logging .getLogger (__name__ )
@@ -137,35 +143,35 @@ class LogOnAccess(property, typing.Generic[_OwnerT, _ReturnT]):
137143
138144 def __init__ (
139145 self ,
140- fget : typing . Optional [ typing . Callable [[_OwnerT ], _ReturnT ]] = None ,
141- fset : typing . Optional [ typing . Callable [[_OwnerT , _ReturnT ], None ]] = None ,
142- fdel : typing . Optional [ typing . Callable [[_OwnerT ], None ]] = None ,
143- doc : typing . Optional [ str ] = None ,
146+ fget : Callable [[_OwnerT ], _ReturnT ] | None = None ,
147+ fset : Callable [[_OwnerT , _ReturnT ], None ] | None = None ,
148+ fdel : Callable [[_OwnerT ], None ] | None = None ,
149+ doc : str | None = None ,
144150 * ,
145151 # Extended settings start
146- logger : typing . Optional [ typing . Union [ logging .Logger , str ]] = None ,
152+ logger : logging .Logger | str | None = None ,
147153 log_object_repr : bool = True ,
148154 log_level : int = logging .DEBUG ,
149155 exc_level : int = logging .DEBUG ,
150156 log_before : bool = True ,
151157 log_success : bool = True ,
152158 log_failure : bool = True ,
153159 log_traceback : bool = True ,
154- override_name : typing . Optional [ str ] = None ,
160+ override_name : str | None = None ,
155161 max_indent : int = 20 ,
156162 ) -> None :
157163 """Advanced property main entry point.
158164
159165 :param fget: normal getter.
160- :type fget: typing.Optional[typing. Callable[[typing.Any, ], typing.Any]]
166+ :type fget: Callable[[_OwnerT ], _ReturnT] | None
161167 :param fset: normal setter.
162- :type fset: typing.Optional[typing. Callable[[typing.Any, typing.Any ], None]]
168+ :type fset: Callable[[_OwnerT, _ReturnT ], None] | None
163169 :param fdel: normal deleter.
164- :type fdel: typing.Optional[typing. Callable[[typing.Any, ], None]]
170+ :type fdel: Callable[[_OwnerT ], None] | None
165171 :param doc: docstring override
166- :type doc: typing.Optional[ str]
172+ :type doc: str | None
167173 :param logger: logger instance or name to use as override
168- :type logger: typing.Optional[typing.Union[ logging.Logger, str]]
174+ :type logger: logging.Logger | str | None
169175 :param log_object_repr: use `repr` over object to describe owner if True else owner class name and id
170176 :type log_object_repr: bool
171177 :param log_level: log level for successful operations
@@ -181,14 +187,14 @@ def __init__(
181187 :param log_traceback: Log traceback on exceptions
182188 :type log_traceback: bool
183189 :param override_name: override property name if not None else use getter/setter/deleter name
184- :type override_name: typing.Optional[ str]
190+ :type override_name: str | None
185191 :param max_indent: maximal indent before classic repr() call
186192 :type max_indent: int
187193 """
188194 super ().__init__ (fget = fget , fset = fset , fdel = fdel , doc = doc )
189195
190196 if logger is None or isinstance (logger , logging .Logger ):
191- self .__logger : typing . Optional [ logging .Logger ] = logger
197+ self .__logger : logging .Logger | None = logger
192198 else :
193199 self .__logger = logging .getLogger (logger )
194200
@@ -199,28 +205,28 @@ def __init__(
199205 self .__log_success : bool = log_success
200206 self .__log_failure : bool = log_failure
201207 self .__log_traceback : bool = log_traceback
202- self .__override_name : typing . Optional [ str ] = override_name
208+ self .__override_name : str | None = override_name
203209 self .__max_indent : int = max_indent
204210 self .__name : str = ""
205- self .__owner : typing . Optional [ typing . Type [ _OwnerT ]] = None
211+ self .__owner : type [ _OwnerT ] | None = None
206212
207- def __set_name__ (self , owner : typing . Optional [ typing . Type [ _OwnerT ]] , name : str ) -> None :
213+ def __set_name__ (self , owner : type [ _OwnerT ] | None , name : str ) -> None :
208214 """Set __name__ and __objclass__ property.
209215
210216 :param owner: owner class, where descriptor applied
211- :type owner: typing.Optional[ type]
217+ :type owner: type[_OwnerT] | None
212218 :param name: descriptor name
213219 :type name: str
214220 """
215221 self .__owner = owner
216222 self .__name = name
217223
218224 @property
219- def __objclass__ (self ) -> typing . Optional [ typing . Type [ _OwnerT ]] : # pragma: no cover
225+ def __objclass__ (self ) -> type [ _OwnerT ] | None : # pragma: no cover
220226 """Read-only owner.
221227
222228 :return: property owner class
223- :rtype: typing.Optional[ type]
229+ :rtype: type[_OwnerT] | None
224230 """
225231 return self .__owner
226232
@@ -235,19 +241,19 @@ def __traceback(self) -> str:
235241 return ""
236242 exc_info = sys .exc_info ()
237243 stack : traceback .StackSummary = traceback .extract_stack ()
238- full_tb : typing . List [traceback .FrameSummary ] = [elem for elem in stack if elem .filename != _CURRENT_FILE ]
239- exc_line : typing . List [str ] = traceback .format_exception_only (* exc_info [:2 ])
244+ full_tb : list [traceback .FrameSummary ] = [elem for elem in stack if elem .filename != _CURRENT_FILE ]
245+ exc_line : list [str ] = traceback .format_exception_only (* exc_info [:2 ])
240246 # Make standard traceback string
241247 tb_text = "\n Traceback (most recent call last):\n " + "" .join (traceback .format_list (full_tb )) + "" .join (exc_line )
242248 return tb_text
243249
244- def __get_obj_source (self , instance : _OwnerT , owner : typing . Optional [ typing . Type [ _OwnerT ]] = None ) -> str :
250+ def __get_obj_source (self , instance : _OwnerT , owner : type [ _OwnerT ] | None = None ) -> str :
245251 """Get object repr block.
246252
247253 :param instance: object instance
248254 :type instance: typing.Any
249255 :param owner: object class (available for getter usage only)
250- :type owner: typing.Optional[ type]
256+ :type owner: type[_OwnerT] | None
251257 :return: repr of object if it not disabled else repr placeholder
252258 :rtype: str
253259 """
@@ -263,7 +269,7 @@ def _get_logger_for_instance(self, instance: _OwnerT) -> logging.Logger:
263269 """Get logger for log calls.
264270
265271 :param instance: Owner class instance. Filled only if instance created, else None.
266- :type instance: typing.Optional[owner]
272+ :type instance: _OwnerT | None
267273 :return: logger instance
268274 :rtype: logging.Logger
269275 """
@@ -284,12 +290,12 @@ def _get_logger_for_instance(self, instance: _OwnerT) -> logging.Logger:
284290 def __get__ (
285291 self ,
286292 instance : None ,
287- owner : typing . Optional [ typing . Type [ _OwnerT ]] = None ,
293+ owner : type [ _OwnerT ] | None = None ,
288294 ) -> typing .NoReturn :
289295 """Get descriptor.
290296
291297 :param instance: Owner class instance. Filled only if instance created, else None.
292- :type instance: typing.Optional[owner]
298+ :type instance: _OwnerT | None
293299 :param owner: Owner class for property.
294300 :return: getter call result if getter presents
295301 :rtype: typing.Any
@@ -301,12 +307,12 @@ def __get__(
301307 def __get__ (
302308 self ,
303309 instance : _OwnerT ,
304- owner : typing . Optional [ typing . Type [ _OwnerT ]] = None ,
305- ) -> _ReturnT : # noqa: F811
310+ owner : type [ _OwnerT ] | None = None ,
311+ ) -> _ReturnT :
306312 """Get descriptor.
307313
308314 :param instance: Owner class instance. Filled only if instance created, else None.
309- :type instance: typing.Optional[owner]
315+ :type instance: _OwnerT | None
310316 :param owner: Owner class for property.
311317 :return: getter call result if getter presents
312318 :rtype: typing.Any
@@ -316,13 +322,13 @@ def __get__(
316322
317323 def __get__ (
318324 self ,
319- instance : typing . Optional [ _OwnerT ] ,
320- owner : typing . Optional [ typing . Type [ _OwnerT ]] = None ,
321- ) -> _ReturnT : # noqa: F811
325+ instance : _OwnerT | None ,
326+ owner : type [ _OwnerT ] | None = None ,
327+ ) -> _ReturnT :
322328 """Get descriptor.
323329
324330 :param instance: Owner class instance. Filled only if instance created, else None.
325- :type instance: typing.Optional[owner]
331+ :type instance: _OwnerT | None
326332 :param owner: Owner class for property.
327333 :return: getter call result if getter presents
328334 :rtype: typing.Any
@@ -360,7 +366,7 @@ def __set__(self, instance: _OwnerT, value: _ReturnT) -> None:
360366 """Set descriptor.
361367
362368 :param instance: Owner class instance. Filled only if instance created, else None.
363- :type instance: typing.Optional
369+ :type instance: _OwnerT | None
364370 :param value: Value for setter
365371 :raises AttributeError: Setter is not available
366372 :raises Exception: Something goes wrong
@@ -396,7 +402,7 @@ def __delete__(self, instance: _OwnerT) -> None:
396402 """Delete descriptor.
397403
398404 :param instance: Owner class instance. Filled only if instance created, else None.
399- :type instance: typing.Optional
405+ :type instance: _OwnerT | None
400406 :raises AttributeError: Deleter is not available
401407 :raises Exception: Something goes wrong
402408 """
@@ -423,20 +429,20 @@ def __delete__(self, instance: _OwnerT) -> None:
423429 raise
424430
425431 @property
426- def logger (self ) -> typing . Optional [ logging .Logger ] :
432+ def logger (self ) -> logging .Logger | None :
427433 """Logger instance to use as override.
428434
429435 :return: logger instance if set
430- :rtype: typing.Optional[ logging.Logger]
436+ :rtype: logging.Logger | None
431437 """
432438 return self .__logger
433439
434440 @logger .setter
435- def logger (self , logger : typing . Union [ logging .Logger , str , None ] ) -> None :
441+ def logger (self , logger : logging .Logger | str | None ) -> None :
436442 """Logger instance to use as override.
437443
438444 :param logger: logger instance, logger name or None if override disable required
439- :type logger: typing.Union[ logging.Logger, str, None]
445+ :type logger: logging.Logger | str | None
440446 """
441447 if logger is None or isinstance (logger , logging .Logger ):
442448 self .__logger = logger
@@ -570,20 +576,20 @@ def log_traceback(self, value: bool) -> None:
570576 self .__log_traceback = value
571577
572578 @property
573- def override_name (self ) -> typing . Optional [ str ] :
579+ def override_name (self ) -> str | None :
574580 """Override property name if not None else use getter/setter/deleter name.
575581
576582 :return: property name override
577- :rtype: typing.Optional[ str]
583+ :rtype: str | None
578584 """
579585 return self .__override_name
580586
581587 @override_name .setter
582- def override_name (self , name : typing . Optional [ str ] ) -> None :
588+ def override_name (self , name : str | None ) -> None :
583589 """Override property name if not None else use getter/setter/deleter name.
584590
585591 :param name: property name override
586- :type name: typing.Optional[ str]
592+ :type name: str | None
587593 """
588594 self .__override_name = name
589595
0 commit comments