Что берет inner в себе аргумент? обясните детально пжл

def decorator(func):
    def inner(*args):
        start = timer()
        print(f"Function {func.__name__} starts its work")
        func(*args)
        end = timer()
        print(f"Function {func.__name__} took {end-start} time")

    return inner


@decorator
def something(a,b):
    time.sleep(3)
    print(a+b)
something(4,5)


Ответы (1 шт):

Автор решения: Іван Шнір

Функция inner принимает все аргументы функции, в которой вы используете декоратор.
В вашем случае это 4 и 6.
Если вы не понимаете как это использовать попробуйте прочитать ниже.

Дополнение

Декоратор - это доп. функция которая запускается перед запуском основной функции.
Посмотрим на примере:

def DopFunc(func):
    def local_func(*args):
        print("Все аргументы основной функции -", args)
        return func(args)
    return local_func

@DopFunc
def main(*args):
    print("Выполнение основной функции")

main(1,2,4,"2344r")

Вывод:
Все аргументы основной функции - (1, 2, 4, '2344r')
Выполнение основной функции

Вот базовое применение декоратора, как видно local_func в *args
забирает все аргументы функции main Вообще есть два вида "особенных аргументов для функции" это *args и **kwargs отличия их в том что *args если видит елементи которые переданы функции но уже нет никакой свободной переменной в функции то он собирает из них массив.
А **kwargs применяется как словарь с ключом и значением.
Пример:

def func(*args, **kwargs):
    print("args -",args)
    print("kwargs -", kwargs)

func("decorater", "class", "classroom", for_example="for_example", kwargs="args")

Вывод:
args - ('decorater', 'class', 'classroom')
kwargs - {'for_example': 'for_example', 'kwargs': 'args'}

→ Ссылка