Skip to content

maybe

Module/Function Name: maybe

def maybe(fn):
    """
    Decorator that calls a function if the first argument exists.

    Args:
        fn (function): The function to wrap.

    Returns:
        function: The wrapped function.
    """

    @wraps(fn)
    def inner(x, *args, **kwargs):
        if not exists(x):
            return x
        return fn(x, *args, **kwargs)

    return inner

Description:

The maybe function is a Python decorator that wraps a given function (fn) and alters its behavior in such a way that it only calls this function if the first argument provided (x) exists. In the context of this decorator, "exists" typically means that x is not None although this could be adjusted to accommodate any variations on what it means for x to "exist" depending on your specific use case.

This type of decorator can be tremendously useful in a number of contexts, including data preprocessing, data validation, error handling, and more.

Parameters:

Parameter Type Description
fn function The function to be decorated

Returns:

Return Type Description
function function The decorated function

Usage Example:

from functools import wraps


def exists(x):
    return x is not None


def maybe(fn):
    @wraps(fn)
    def inner(x, *args, **kwargs):
        if not exists(x):
            return x
        return fn(x, *args, **kwargs)

    return inner


@maybe
def add_one(x):
    return x + 1


print(add_one(None))  # Returns: None
print(add_one(2))  # Returns: 3

In this example, we have created a maybe decorator using the given maybe function and applied it to the add_one function. When we call add_one with None as the argument, the maybe decorator checks if None exists (which it does not), and so it simply returns None without calling the add_one function.

However, when we call add_one with 2 as the argument, the maybe decorator checks if 2 exists (which it does), and so it proceeds to call the add_one function, resulting in 3.

Additional Information:

The maybe decorator utilises the @wraps decorator from the functools module which updates the wrapper function to look like the wrapped function. This includes the function name, docstring, and module, amongst other attributes.

The if not exists(x) part of the inner function acts as a short-circuit evaluation. This means fn(x, *args, **kwargs) is not executed if the x argument does not exist, thus preventing potential errors or exceptions from occurring.

Please ensure to define an exists function according to your requirement, as it works with the maybe decorator to determine whether or not the function fn should be invoked.