2017-07-20 2 views
0

konvertieren Ich kann nicht für das Leben von mir herauszufinden, wie man dies zu einem Dekorateur. Jede Hilfe oder ein Beispiel wäre genial. HierPython: Wie kann ich dies in einen Dekorateur

ist der Code

import datetime  

def time_func(function, *args, **kwargs): 
    ''' 
    Add the execution time to a functions attributes 
    ''' 
    # Start the clock. 
    start = datetime.datetime.now() 
    # Execute the function and record the results. 
    function_result = function(*args, **kwargs) 
    # Calculate the elapsed time and add it to the function 
    # attributes. 
    function.elapsed = datetime.datetime.now() - start 
    # Returned the function with the added elapsed attribute 
    return function_result 

Hier ist ein Beispiel

.. import datetime 
.. 
.. 
.. def time_func(function, *args, **kwargs): 
.. ''' 
.. Add the execution time to a functions attributes 
.. ''' 
.. # Start the clock. 
.. start = datetime.datetime.now() 
.. # Execute the function and record the results. 
.. function_result = function(*args, **kwargs) 
.. # Calculate the elapsed time and add it to the function 
.. # attributes. 
.. function.elapsed = datetime.datetime.now() - start 
.. # Returned the function with the added elapsed attribute 
.. return function_result 
..  
.. 
.. def f(name): 
.. print name 
..  
.. time_func(f, 'foo') 
.. print f.elapsed 
.. 
foo 
0:00:00.000115 
+0

Überprüfen Sie dies [post] (https://Stackoverflow.com/a/44846831/6655211) – PRMoureu

+0

Haben Sie über die Verwendung des 'timeit'-Moduls nachgedacht? – cmd

Antwort

2

Ein Dekorator ist einfach eine Funktion, die eine Funktion übernimmt und eine Funktion zurückgibt.

import datetime 

def time_func(function): 
    # create a new function based on the existing one, 
    # that includes the new timing behaviour 
    def new_func(*args, **kwargs): 
     # Start the clock. 
     start = datetime.datetime.now() 
     # Execute the function and record the results. 
     function_result = function(*args, **kwargs) 
     # Calculate the elapsed time and add it to the function 
     # attributes. 
     new_func.elapsed = datetime.datetime.now() - start 
     # Returned the function with the added elapsed attribute 
     return function_result 
    return new_func 

Verbrauch:

@time_func 
def f(name): 
    print(name) 

f('foo') 
print(f.elapsed) 
> foo 
> 0:00:00.000045 

Check out functools.wraps, um den Dekorateur zu verbessern.

1

definieren eine innere Funktion:

import datetime  

def time_func(function): 
    ''' 
    Add the execution time to a functions attributes 
    ''' 
    def func(*args, **kwargs): 
     start = datetime.datetime.now() 
     function_result = function(*args, **kwargs) 
     func.elapsed = datetime.datetime.now() - start 
     return function_result 
    return func 

@time_func 
def f(name): 
    print name 
0

Ein üblicher Weg Dekoratore zu machen ist, t benutzen wo verschachtelte Funktionen:

def time_func(function): 
    def wrapper(*args, **kwargs): 
     start = datetime.datetime.now() 
     function_result = function(*args, **kwargs) 
     wrapper.elapsed = datetime.datetime.now() - start 
     return function_result 
    return wrapper 

Der einzige große zwischen diesem Code und die Original (außer die Kommentare für die Raum Strippen) ist, dass die function durch einen Aufruf der äußeren Funktion zugeführt wird, während die anderen Argumente geliefert werden die Wrapper-Funktion. Wir müssen auch die elapsed Zeit auf der wrapper Funktion anstelle der ursprünglichen Funktion speichern (da das Original nicht mehr zugänglich sein wird, wenn Sie ein Dekorateur sind).

+2

Dies funktioniert nicht, da 'function.relate 'das Ergebnis in der alten Funktion speichert und nicht in der umbrochenen. Verwenden Sie stattdessen 'wrapper.lapsed'. – Marein

+0

Danke, ich habe meine Antwort bearbeitet, um das zu korrigieren. – Blckknght