@Measured - стандартный декоратор? В какой это библиотеке?

В эта статья в блоге они используют конструкцию:

  @measured
  def some_func():
    #...
  # Presumably outputs something like "some_func() is finished in 121.333 s" somewhere

Эта директива @measured, похоже, не работает с необработанным питоном. Что это?

ОБНОВЛЕНИЕ: из Триптиха я вижу, что @something действителен, но где я могу найти @measured, находится ли он где-то в библиотеке или автор этого блога использует что-то из своей собственной базы кода?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
465
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Да это реально. Это декоратор функций.

Декораторы функций в Python - это функции, которые принимают функцию в качестве единственного аргумента и возвращают вместо нее новую функцию.

@classmethod и @staticmethod - два встроенных декоратора функций.

Читать далее "

измеряется - это имя функции, которая должна быть определена перед тем, как этот код заработает.

Как правило, любая функция, используемая в качестве декоратора, должна принимать функцию и возвращать функцию. Функция будет заменена результатом передачи ее в декоратор - в этом случае измеряется ().

Вы сбиваете с толку терминологию. В частности, генераторы имеют очень точное определение в Python. Кроме того, хотя верно то, что измеряемое значение должно быть определено, это на самом деле не объясняет, что он делает.

Triptych 20.12.2008 03:36

Ба, да. Совершенно верно. Это декоратор, а не генератор. Опечатка исправлена. У меня сегодня только генераторы в мозгу. Из приведенного отрывка невозможно узнать, что он делает, поэтому я не уверен, что можно объяснить, что он делает.

recursive 20.12.2008 03:40
Ответ принят как подходящий

@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 *

Я считаю, что это не стандартная функция, но спасибо, что написали ее для меня!

Tristan Havelick 20.12.2008 03:39

Я заметил, что аргументы функции не упоминаются в примере кода, означает ли это, что они автоматически обрабатываются Python "правильно"?

unwind 22.09.2009 17:15

Я искал хорошее объяснение дескрипторов, и этот сделал это за меня. Спасибо

Michael Groner 22.09.2009 18:52

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

dbr 23.09.2009 01:41

Другие вопросы по теме