2013-06-20 36 views
5

Cóż, muszę przyznać, że jestem nowy w branży, a nawet python, ale jestem zainteresowany robieniem tego we właściwy sposób, więc ... Chcę ozdobić niektóre z moich zadania z funkcją prepare, która dodaje kilka zmiennych do env w zależności od już podanych. Rzucić okiem:Jak dodać niestandardowy dekorator do zadania tkaniny

from fabric.api import * 
import fabstork.project.base as base 
import fabstork.utils.drupal as utils 

def prepare(task): 
    """ Decorator to set some additional environment variables """ 
    def prepared(*args, **kwargs): 
     env.sites_folder = env.sites_folder if 'sites_folder' in env else 'default' 
     env.settings_file = "%s/www/sites/%s/settings.php" % (env.build_path, env.sites_folder) 
     # more to come 
     return task(*args, **kwargs) 

    return prepared 


@task 
@prepare 
def push(ref='HEAD'): 
    """ 
    Deploy a commit to a host 
    """ 
    base.push(ref) 
    utils.settings_php() 
    utils.link_files() 
    utils.set_perms() 

Powyższy przykład nie powiedzie się, że push ma zadanie już, to nie w liście dostępnych zadań, gdy robi fab --list w wierszu poleceń. Pominięcie dekoratora prowadzi do doskonałego zadania. Co ja robię źle?

Odpowiedz

8
from fabric.decorators import task 
from functools import wraps 

def custom_decorator(func): 
    @wraps(func) 
    def decorated(*args, **kwargs): 
     print "this function is decorated." 
     return func(*args, **kwargs) 
    return decorated 

@task 
@custom_decorator 
def some_function(): 
    print "this is function" 

wynik:

# fab -l 
>Available commands: 
> 
> some_function 

# fab some_function 
>this function is decorated. 
>this is function 
> 
>Done. 
+1

Dzięki! Więc w zasadzie brakowało mi ** @ wraps (func) **. Czy mógłbyś zaktualizować swoją odpowiedź, aby wyraźnie to podkreślić? – aaki