2009-10-02 10 views
6

私は、コマンドラインから呼び出してライブラリ関数としてインポートできるようにするPythonスクリプトを作成しています。 理想的には、コマンドラインオプションと関数は同じデフォルト値のセットを使用する必要があります。 どちらの場所でもデフォルトの単一のセットを再利用できる最良の方法は何ですか?Pythonのoptparseのデフォルトと関数のデフォルト値

ここには重複したデフォルトの現在のコードがあります。

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を使用してください。ハンドルに続いて、位置とキーワードのargs(キーワードargsは位置を上書きします)。

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)) 
関連する問題