В эта статья в блоге они используют конструкцию:
@measured
def some_func():
#...
# Presumably outputs something like "some_func() is finished in 121.333 s" somewhere
Эта директива @measured, похоже, не работает с необработанным питоном. Что это?
ОБНОВЛЕНИЕ: из Триптиха я вижу, что @something действителен, но где я могу найти @measured, находится ли он где-то в библиотеке или автор этого блога использует что-то из своей собственной базы кода?






Да это реально. Это декоратор функций.
Декораторы функций в Python - это функции, которые принимают функцию в качестве единственного аргумента и возвращают вместо нее новую функцию.
@classmethod и @staticmethod - два встроенных декоратора функций.
измеряется - это имя функции, которая должна быть определена перед тем, как этот код заработает.
Как правило, любая функция, используемая в качестве декоратора, должна принимать функцию и возвращать функцию. Функция будет заменена результатом передачи ее в декоратор - в этом случае измеряется ().
Ба, да. Совершенно верно. Это декоратор, а не генератор. Опечатка исправлена. У меня сегодня только генераторы в мозгу. Из приведенного отрывка невозможно узнать, что он делает, поэтому я не уверен, что можно объяснить, что он делает.
@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 *
Я считаю, что это не стандартная функция, но спасибо, что написали ее для меня!
Я заметил, что аргументы функции не упоминаются в примере кода, означает ли это, что они автоматически обрабатываются Python "правильно"?
Я искал хорошее объяснение дескрипторов, и этот сделал это за меня. Спасибо
раскрутка: Хороший момент, я забыл об аргументах. Исправлен код для передачи всех аргументов в "обернутую" функцию
Вы сбиваете с толку терминологию. В частности, генераторы имеют очень точное определение в Python. Кроме того, хотя верно то, что измеряемое значение должно быть определено, это на самом деле не объясняет, что он делает.