Можно ли передать аргумент в декорированную функцию?

Я написал ниже декоратор:

import time

def runtime(some_function):   
    def wrapper():
        start = time.time()        
        some_function()         
        runtime = time.time() - start   
        print(runtime)       
    return wrapper              

@runtime
def printing(upper_limit):
    for number in range(upper_limit):
        print(number)

printing(10)
printing(100)
printing(1000)
printing(10000)

Почему я получаю:

TypeError: wrapper () принимает 0 позиционных аргументов, но 1 был задан

при запуске кода и как это исправить?

1 ответ

Вам нужно сделать wrapper принять аргументы и передать их some_function, Следует также вернуть то, что some_function возвращается, чтобы быть более общим.

def runtime(some_function):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = some_function(*args, **kwargs)
        runtime = time.time() - start
        print(runtime)
        return result
    return wrapper
Другие вопросы по тегам