Проблема создания декоратора в Python3 - PullRequest
0 голосов
/ 24 мая 2018

Может кто-нибудь сообщить мне, какую ошибку я совершаю.

Декоратор

import time

def f1(f):

    a = time.time()
    f()
    b = time.time()
    c = b-a
    print("time required is", c)
@f1

def f3(f2):

    n = []
    for i in range(1000):
        n.append(i)
    print(sum(n), "for F3")
    f2()

@f3

def f4():

    n = []
    for i in range(1000):
       n.append(i)
    print(sum(n), "for F4")

f4

o / p:

Traceback (последний последний вызов):

File "C:/test.py", line 13, in <module>

@f1

File "C:/test.py", line 7, in f1

f()

TypeError: f3() missing 1 required positional argument: 'f2'

Process finished with exit code 1

в поисках чего-то подобного:

def decorator_with_args (decorator_to_enhance):

def decorator_maker(*args, **kwargs):

    def decorator_wrapper(func):

        return decorator_to_enhance(func, *args, **kwargs)

    return decorator_wrapper

return decorator_maker

@ decorator_with_args

def decor_decorator (func, *args, ** kwargs):

def wrapper(function_arg1, function_arg2):

    print("Decorated with {0} {1}".format(args, kwargs))

    return func(function_arg1, function_arg2)

return wrapper

@ decor_decorator (42, 404, 1024)

def decor_function (function_arg1, function_arg2):

print("Hello {0} {1}".format(function_arg1, function_arg2))

decor_function («Вселенная и», «все»)

1 Ответ

0 голосов
/ 24 мая 2018

Хотя вы можете выполнять перенос и работать в другой единственной функции, которая не возвращает ни одного вызываемого объекта, имейте в виду, что перенесенная функция больше не вызывается.Таким образом, когда синхронизируются объекты, которые не требуют повторного использования исходного объекта, ваш текущий код работает:

import time
def timeit(f):
  c = time.time()
  _ = f()
  c2 = time.time()
  print(f"'{f.__name__}' took {c2-c}s")

@timeit
def f2():
  return sum(range(1000))

Вывод (без вызова f2):

'f2' took 8.988380432128906e-05s

Однако,при попытке вызвать f2:

_ = f2()

Traceback (последний вызов был последним): файл "", строка 1, в TypeError: объект 'NoneType' не вызывается

Чтобы предотвратить вышеуказанную ошибку, создайте функцию-обертку внутри функции декорирования:

def timeit(f):
 def wrapper(*args, **kwargs):
    c = time.time()
    _result = f(*args, **kwargs)
    c2 = time.time()
    print(f"'{f.__name__}' took {c2-c}s")
    return _result
 return wrapper

@timeit
def f2():
  return sum(range(1000))

f2 не будет синхронизироваться до ее вызова, вызывая wrapper:

print(f2())

Выход:

'f2' took 3.981590270996094e-05s
499500
...