import logging from time import perf_counter from functools import wraps logging.basicConfig( format="%(asctime)s - %(levelname)s - %(message)s", level=logging.DEBUG, datefmt="%Y-%m-%d %H:%M:%S" ) def timer(func): @wraps(func) def _timer(*args, **kwargs): logging.info(f"Executing {func.__name__}.") start = perf_counter() result = func(*args, **kwargs) end = perf_counter() logging.info(f"Executed {func.__name__} in {start-end: .6f} seconds.") return result return _timer @timer def elementwise_unsafe_divide(array, divisor): if not all((divisor, isinstance(divisor, int))): logging.critical("Invalid divisor provided:", divisor) exit(1) result = [] invalid_operations = 0 for elem in array: try: result.append(elem / divisor) except (ZeroDivisionError, TypeError): invalid_operations += 1 result.append(elem) continue logging.warning(f"Encountered {invalid_operations} invalid operations") return result def main(): arr = [1, 2, 4, "hi", "bye"] print("Array:", arr) result = elementwise_unsafe_divide(arr, 4) print("arr / 4(elementwise):", result) if __name__ == "__main__": main()