Я пытаюсь написать декораторы Python, и у меня возникают проблемы с пониманием того, как внутренняя оболочка принимает аргументы. У меня есть здесь:
import time
def timing_function(some_function):
def wrapper():
t1 = time.time()
some_function()
t2 = time.time()
return "Time it took to run: " + str((t2-t1)) + "\n"
return wrapper
@timing_function
def my_function(x):
return x * x
my_function(6)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-fe2786a2753c> in <module>()
----> 1 my_function(6)
TypeError: wrapper() takes no arguments (1 given)
Что немного отличается от примера:
import time
def timing_function(some_function):
"""
Outputs the time a function takes
to execute.
"""
def wrapper():
t1 = time.time()
some_function()
t2 = time.time()
return "Time it took to run the function: " + str((t2-t1)) + "\n"
return wrapper
@timing_function
def my_function():
num_list = []
for x in (range(0,10000)):
num_list.append(x)
return "\nSum of all the numbers: " +str((sum(num_list)))
print my_function()
Time it took to run the function: 0.0
Кажется, проблема заключается в аргументе «x». Я пробовал передать обертку *args, но это тоже не сработало. Мои вопросы
Как правильно разрешить аргументы в этой простой оболочке? Спасибо
Почему все примеры декораторов, которые я видел, всегда имеют внутреннюю функцию, нельзя ли написать декоратор как одну функцию?
Спасибо
*args
,**kwargs
в своей подписи оболочки, чтобыdef wrapper()
сталоdef wrapper(*args, **kwargs)
. Таким образом, вы можете использовать декоратор для любого метода или функции. - person Christopher Pearson   schedule 18.06.2015