2010-07-19 15 views
9

en el momento en que mi código Python a menudo se parece a esto:Método para carreras en seco?

... 
if not dry_run: 
    result = shutil.copyfile(...) 
else: 
    print " DRY-RUN: shutil.copyfile(...) " 
... 

Ahora pienso acerca escribiendo algo así como un método corredor seco:

def dry_runner(cmd, dry_run, message, before="", after=""): 
    if dry_run: 
     print before + "DRY-RUN: " + message + after 
    # return execute(cmd) 

Pero el cmd se ejecutará primero y el resultado es dado al método dry_runner.

¿Cómo puedo codificar este método de manera pitonica?

Respuesta

4

puede utilizar esta función de contenedor genérico:

def execute(func, *args): 
    print 'before', func 
    if not dry: 
     func(*args) 
    print 'after', func 

>>> execute(shutil.copyfile, 'src', 'dst') 
4

Esto no es perfecta en su pantalla, pero funciona la funcionalidad. Esperemos que esto sea lo suficientemente claro:

dry = True 

def dryrun(f): 
    def wrapper(*args, **kwargs): 
     if dry: 
      print "DRY RUN: %s(%s)" % (f.__name__, 
             ','.join(list(args) + ["%s=%s" % (k, v) for (k, v) in kwargs.iteritems()])) 
     else: 
      f(*args, **kwargs) 
    return wrapper 

import shutil 
copyfile = dryrun(shutil.copyfile) 

copyfile('a', 'b') 
Cuestiones relacionadas