2010-07-19 11 views
9

पल में मेरी अजगर कोड अक्सर इस तरह दिखता है:शुष्क रन के लिए विधि?

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

मैं अब एक सूखी धावक विधि की तरह कुछ writting के बारे में सोचना:

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

लेकिन cmd पहले निष्पादित किया जाएगा और परिणाम है dry_runner विधि को दिया गया।

मैं इस तरह की विधि को पाइथोनिक तरीके से कैसे कोड कर सकता हूं?

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

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

उत्तर

4

आप इस सामान्य आवरण समारोह इस्तेमाल कर सकते हैं। उम्मीद है कि यह पर्याप्त स्पष्ट है:

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') 
4

यह अपने प्रदर्शन में सही नहीं है, लेकिन कार्यक्षमता काम करता है:

संबंधित मुद्दे