@measured
украшает функцию some_func (), используя функцию или класс с именем measured
. @
- это синтаксис декоратора, measured
- имя функции декоратора.
Декораторы могут быть немного сложны для понимания, но в основном они используются для переноса кода вокруг функции или внедрения кода в одну.
Например, измеренная функция (используемая в качестве декоратора), вероятно, реализована следующим образом ...
import time
def measured(orig_function):
# When you decorate a function, the decorator func is called
# with the original function as the first argument.
# You return a new, modified function. This returned function
# is what the to-be-decorated function becomes.
print "INFO: This from the decorator function"
print "INFO: I am about to decorate %s" % (orig_function)
# This is what some_func will become:
def newfunc(*args, **kwargs):
print "INFO: This is the decorated function being called"
start = time.time()
# Execute the old function, passing arguments
orig_func_return = orig_function(*args, **kwargs)
end = time.time()
print "Function took %s seconds to execute" % (end - start)
return orig_func_return # return the output of the original function
# Return the modified function, which..
return newfunc
@measured
def some_func(arg1):
print "This is my original function! Argument was %s" % arg1
# We call the now decorated function..
some_func(123)
#.. and we should get (minus the INFO messages):
This is my original function! Argument was 123
# Function took 7.86781311035e-06 to execute
Синтаксис декоратора - это более короткий и удобный способ сделать следующее:
def some_func():
print "This is my original function!"
some_func = measured(some_func)
В Python включены некоторые декораторы, например staticmethod
- но measured
не является одним из них:
>>> type(measured)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'measured' is not defined
Проверьте операторы import
проектов, чтобы увидеть, откуда поступает функция или класс. Если он использует from blah import *
, вам нужно проверить все эти файлы (именно поэтому import *
не рекомендуется), или вы можете просто сделать что-то вроде grep -R def measured *