CCCPaste

python_decorator

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()