Является ли @measured стандартным декоратором? В какой это библиотеке? - PullRequest
2 голосов
/ 20 декабря 2008

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 20 декабря 2008

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

3 голосов
/ 20 декабря 2008

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

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

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

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

0 голосов
/ 20 декабря 2008

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

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

...