2009-10-02 10 views
6

मैं एक पायथन स्क्रिप्ट लिख रहा हूं जिसे मैं कमांड लाइन से कॉल करने और लाइब्रेरी फ़ंक्शन के रूप में आयात करने में सक्षम होना चाहता हूं। आदर्श रूप से कमांड लाइन विकल्प और फ़ंक्शन को डिफ़ॉल्ट मानों के समान सेट का उपयोग करना चाहिए। मुझे दोनों जगहों पर डिफ़ॉल्ट रूप से एक सेट का पुन: उपयोग करने की अनुमति देने का सबसे अच्छा तरीका क्या है?पायथन ऑप्टपरसे डिफ़ॉल्ट बनाम फ़ंक्शन डिफ़ॉल्ट

डुप्लिकेट डिफ़ॉल्ट के साथ वर्तमान कोड यहां दिया गया है।

from optparse import OptionParser 

def do_stuff(opt1="a", opt2="b", opt3="c"): 
    print opt1, opt2, opt3 

if __name__ == "__main__": 
    parser = OptionParser() 
    parser.add_option("--opt1", default="a") 
    parser.add_option("--opt2", default="b") 
    parser.add_option("--opt3", default="c") 
    #parser.set_defaults(opt1="a") 

    options, args = parser.parse_args() 

    do_stuff(*args, **vars(options)) 

उत्तर

3

मैं इसे ब्याज के समारोह आत्मनिरीक्षण उचित रूप से विकल्प और डिफ़ॉल्ट सेट करने से संभाल चाहते हैं। उदाहरण के लिए:

import inspect 
from optparse import OptionParser 
import sys 

def do_stuff(opt0, opt1="a", opt2="b", opt3="c"): 
    print opt0, opt1, opt2, opt3 

if __name__ == "__main__": 
    parser = OptionParser() 
    args, varargs, varkw, defaults = inspect.getargspec(do_stuff) 
    if varargs or varkw: 
     sys.exit("Sorry, can't make opts from a function with *a and/or **k!") 
    lend = len(defaults) 
    nodef = args[:-lend] 
    for a in nodef: 
     parser.add_option("--%s" % a) 
    for a, d in zip(args[-lend:], defaults): 
     parser.add_option("--%s" % a, default=d) 

    options, args = parser.parse_args() 
    d = vars(options) 
    for n, v in zip(nodef, args): 
     d[n] = v 

    do_stuff(**d) 
2

यहां समाधान है - यदि आपको केवल कीवर्ड तर्क की आवश्यकता है तो यह छोटा है - केवल locals.update का उपयोग करें। निम्नलिखित हैंडल दोनों के बाद, स्थितित्मक और कुंजी शब्द तर्क (कुंजी शब्द तर्क स्थितित्मक ओवरराइड)।

from optparse import OptionParser 

ARGS = {'opt1': 'a', 
     'opt2': 'b', 
     'opt3': 'c'} 

def do_stuff(*args, **kwargs): 
    locals = ARGS 

    keys = ARGS.keys() 
    keys.sort() 

    if args: 
     for key,arg in zip(keys,args): 
      locals.update({key: arg}) 
    if kwargs: 
     locals.update(kwargs) 

    print locals['opt1'], locals['opt2'], locals['opt3'] 

if __name__ == "__main__": 
    parser = OptionParser() 
    for key,default in ARGS.items(): 
     parser.add_option('--%s' % key, default='%s' % default) 

    options, args = parser.parse_args() 

    do_stuff(*args, **vars(options)) 
    do_stuff() 
    do_stuff('d','e','f') 
    do_stuff('d','e','f', opt3='b') 
    do_stuff(opt1='c', opt2='a', opt3='b') 

आउटपुट:

a b c 
a b c 
d e f 
d e b 
c a b 
2

एलेक्स द्वारा निरीक्षण समाधान बहुत शक्तिशाली है!

हल्के कार्यक्रमों के लिए, आप भी बस इस इस्तेमाल कर सकते हैं:

def do_stuff(opt1="a", opt2="b", opt3="c"): 
    print opt1, opt2, opt3 

if __name__ == "__main__": 
    from optparse import OptionParser 
    opts = do_stuff.func_defaults 
    parser = OptionParser()  
    parser.add_option("--opt1", default=opts[0], help="Option 1 (%default)") 
    parser.add_option("--opt2", default=opts[1], help="Option 2 (%default)") 
    parser.add_option("--opt3", default=opts[2], help="Option 3 (%default)") 

    options, args = parser.parse_args() 

    do_stuff(*args, **vars(options)) 
संबंधित मुद्दे