Module pedantic.decorators.fn_deco_trace
Expand source code
import inspect
from datetime import datetime
from functools import wraps
from typing import Any
from pedantic.constants import F, ReturnType
def trace(func: F) -> F:
"""
Prints the passed arguments and the returned value on each function call.
Example:
>>> @trace
... def my_function(a, b, c):
... return a + b + c
>>> my_function(4, 5, 6)
Trace: ... calling my_function() with (4, 5, 6), {}
Trace: ... my_function() returned 15
15
"""
@wraps(func)
def wrapper(*args: Any, **kwargs: Any) -> ReturnType:
print(f'Trace: {datetime.now()} calling {func.__name__}() with {args}, {kwargs}')
original_result = func(*args, **kwargs)
print(f'Trace: {datetime.now()} {func.__name__}() returned {original_result!r}')
return original_result
@wraps(func)
async def async_wrapper(*args: Any, **kwargs: Any) -> ReturnType:
print(f'Trace: {datetime.now()} calling {func.__name__}() with {args}, {kwargs}')
original_result = await func(*args, **kwargs)
print(f'Trace: {datetime.now()} {func.__name__}() returned {original_result!r}')
return original_result
if inspect.iscoroutinefunction(func):
return async_wrapper
else:
return wrapper
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=False, optionflags=doctest.ELLIPSIS)
Functions
def trace(func: Callable[..., ~ReturnType]) ‑> Callable[..., ~ReturnType]
-
Prints the passed arguments and the returned value on each function call.
Example:
>>> @trace ... def my_function(a, b, c): ... return a + b + c >>> my_function(4, 5, 6) Trace: ... calling my_function() with (4, 5, 6), {} Trace: ... my_function() returned 15 15
Expand source code
def trace(func: F) -> F: """ Prints the passed arguments and the returned value on each function call. Example: >>> @trace ... def my_function(a, b, c): ... return a + b + c >>> my_function(4, 5, 6) Trace: ... calling my_function() with (4, 5, 6), {} Trace: ... my_function() returned 15 15 """ @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> ReturnType: print(f'Trace: {datetime.now()} calling {func.__name__}() with {args}, {kwargs}') original_result = func(*args, **kwargs) print(f'Trace: {datetime.now()} {func.__name__}() returned {original_result!r}') return original_result @wraps(func) async def async_wrapper(*args: Any, **kwargs: Any) -> ReturnType: print(f'Trace: {datetime.now()} calling {func.__name__}() with {args}, {kwargs}') original_result = await func(*args, **kwargs) print(f'Trace: {datetime.now()} {func.__name__}() returned {original_result!r}') return original_result if inspect.iscoroutinefunction(func): return async_wrapper else: return wrapper