Frage

dieser Blog-Artikel sie verwenden das Konstrukt:

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

Diese @measured Richtlinie scheint nicht mit rohem Python zu arbeiten. Was ist das?

UPDATE:? Ich von Triptych, dass @something gültig ist, aber wo kann ich @measured finde, ist es in einer Bibliothek ist irgendwo, oder ist der Autor dieses Blogs etwas von seiner eigenen Code-Basis mit

War es hilfreich?

Lösung

@measured ziert die some_func () Funktion, eine Funktion oder eine Klasse mit dem Namen measured verwenden. Die @ ist die Dekorateur Syntax, measured sind die Dekorateur Funktionsnamen.

Dekorateure kann ein bisschen schwer zu verstehen sein, aber sie sind entweder Wrap-Code um eine Funktion im Grunde verwendet, oder Code in eine injizieren.

Zum Beispiel der gemessene Funktion (als Dekorateur verwendet) wahrscheinlich wie dies umgesetzt wird ...

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

Die Dekorateur Syntax ist nur ein kürzerer und sauberere Weg, um den folgenden zu tun:

def some_func():
    print "This is my original function!"

some_func = measured(some_func)

Es gibt einige Dekorateure mit Python enthalten, zum Beispiel staticmethod - aber measured ist nicht einer von ihnen:

>>> type(measured)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'measured' is not defined

Überprüfen Sie die Projekte import Anweisungen, um zu sehen, wo die Funktion oder Klasse herkommt. Wenn es verwendet from blah import * Sie alle diese Dateien überprüfen müssen (weshalb import * abgeraten), oder Sie könnten nur so etwas wie grep -R def measured * tun

Andere Tipps

Ja, es ist echt. Es ist eine Funktion Dekorateur.

Funktion Dekorateure in Python sind Funktionen, die eine Funktion übernehmen, wie es einziges Argument ist, und eine neue Funktion in seinem Platz zurück.

@classmethod und @staticmethod zwei in Funktion Dekorateure gebaut werden.

Lesen Sie mehr »

gemessen ist der Name einer Funktion, die definiert werden müssen, bevor der Code funktioniert.

In der Regel jede Funktion als Dekorateur verwendet wird, muss eine Funktion übernehmen und eine Funktion zurück. Die Funktion wird mit dem Ergebnis, ersetzt werden, um es den Dekorateur zugeben -. Gemessen () in diesem Fall

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top