Примеры декораторов#

Декоратор отображает: имя функции и значение аргументов:

def debugger_with_args(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f'Вызываю функцию {func.__name__} с args {args} и kwargs {kwargs}')
        return func(*args, **kwargs)
    return wrapper


@debugger_with_args
def func(a, b, verbose=True):
    return a, b, verbose


In [3]: func(1, 'a', verbose=False)
Вызываю функцию func с args (1, 'a') и kwargs {'verbose': False}
Out[3]: (1, 'a', False)

Декоратор проверяет что все аргументы функции - строки:

def all_args_str(func):
    @wraps(func)
    def wrapper(*args):
        if not all(isinstance(arg, str) for arg in args):
            raise ValueError('Все аргументы должны быть строками')
        return func(*args)
    return wrapper


@all_args_str
def to_upper(*args):
    result = [s.upper() for s in args]
    return result


In [6]: to_upper('a', 'b')
Out[6]: ['A', 'B']

In [7]: to_upper(1, 'b')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-bf0a0ae9f18c> in <module>
----> 1 to_upper(1, 'b')

<ipython-input-4-9ddfa715e195> in wrapper(*args)
      3     def wrapper(*args):
      4         if not all(isinstance(arg, str) for arg in args):
----> 5             raise ValueError('Все аргументы должны быть строками')
      6         return func(*args)
      7     return wrapper

ValueError: Все аргументы должны быть строками