2013-06-20 33 views
5

Eh, kumaş ve hatta python için yeni olduğumu itiraf etmeliyim ama bunu doğru şekilde yapmakla ilgileniyorum, yani ... Bazılarımı süslemek istiyorum Önceden verilmiş olanlara bağlı olarak env'a bazı varyasyonlar ekleyen prepare işleviyle görevler. Bir göz atın:Kumaş görevine özel bir dekoratör nasıl eklenir

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() 

Yukarıdaki örnek komut satırına bir fab --list yaparken o push hiçbir görev onun değil mevcut görevler listesinde, artık olduğu için başarısız olur. Dekoratörün çıkarılması mükemmel bir göreve yol açar. Neyi yanlış yapıyorum?

cevap

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" 

sonucu:

# fab -l 
>Available commands: 
> 
> some_function 

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

teşekkürler! Bu yüzden temelde kaçırdım ** @ wraps (func) **. Cevabınızı özellikle bunu belirtmek için günceller misiniz? – aaki

İlgili konular