2012-03-29 4 views
8

optparseには、負のオプションを定義する簡単な方法がありますか?たとえば--no-cleanup負のブールオプション--no-whoptはoptparseにありますか?

私はこのようにそれをしなかったが、それは面倒なバグが発生しやすい、忘れて、除外することは容易であるNoneチェックに特に原因です:理想的には私はGetoptions::Longような何かをしたいと思います

#!/bin/env python 

from __future__ import print_function 
import sys 
import optparse 

def main(argv): 
    parser = optparse.OptionParser("usage: %prog [options]") 
    parser.add_option("--no-cleanup", 
         dest = "cleanup", 
         action = "store_false", 
         help = "do cleanup at end?") 

    (opts, args) = parser.parse_args() 

    if opts.cleanup == None: 
     opts.cleanup = True 

    # do stuff ... 

    if opts.cleanup: 
     print("Cleaning up!", file = sys.stderr) 
    else: 
     print("Not cleaning up", file = sys.stderr) 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

Perlでは、オプションcleanupをブール値として定義し、次に自動的に--cleanup--no-cleanupを提供し、それに応じてブール変数を設定します。

+1

argparseにはこの機能がありますか、それともオプションではありませんか? – jterrace

+0

@jterrace:Python v2.6を使用しているので、私はargparseを持っていないと思います。 – Frank

+3

@Frank、argparseはPython2.6で動作しますが、標準ライブラリにはありません。もしあなたがsetuptoolsを持っていれば、 'easy_install argparse'はいつもうまくいってくれました。 – mgilson

答えて

4

optparse(またはその点についてはargparseを使用して、1つのコマンドで--cleanupと--no-cleanupフラグを追加したいと仮定して)これを行う場合は、オプションのパーサークラスをサブクラス化するだけです。 。..ような何か:

もちろん
from optparse import OptionParser 
class MyOptParse(OptionParser): 
     def boolean(self,dest,**kwargs): 
      self.add_option('--%s'%dest,dest=dest,action='store_true',**kwargs) 
      self.add_option('--no-%s'%dest,dest=dest,action='store_false',**kwargs) 

が、これは完全なハックですが、私はそれで行くよどこそれはかなり明白だと思うあなたはそれが(ヘルプを再フォーマットする必要が...あなたはブール振る舞いをすることができますデフォルト値として '--blah'または ' - no-blah'がデフォルトとして設定されています)

私はそれが

と考えていますデフォルトが設定されているので、あなただけのデフォルトを追加したい場合はヘルプメッセージが

(私が提供されているコードで)繰り返されますが、それは、それでいながら、

parser=MyOptParse() 
parser.boolean('cleanup',default=True,help="Do/Do Not do cleanup") 

は仕事とif options.cleanup is Noneラインを取り除く必要があります特定のフラグの(Noneのチェックを取り除くために)、あなたはadd_optionにdefaultキーワードを使用することができ、OR、optparseのドキュメントに従って...

デフォルト値を指定するための明確な方法があるset_defaults() OptionParserのメソッドです。これはyです。いつでも電話してparse_args()を呼び出してください。 parser.set_defaults(verbose=True)

+0

'dest'引数に' .replace( ' - '、 '_') 'を追加してください。 'man gcc'のように、冗長性を避けるためにヘルプを凝縮することは可能ですか? –

-1

optparseは推奨されていません。あなたは、引数のグループを使用して​​でこれを行うことができます。

#!/usr/bin/env python 
import argparse 

def main(): 
    parser = argparse.ArgumentParser() 
    group = parser.add_mutually_exclusive_group() 
    group.add_argument('--cleanup', action='store_true') 
    group.add_argument('--no-cleanup', dest='cleanup', action='store_false') 
    args = parser.parse_args() 

    # do stuff ... 

    if args.cleanup: 
     print("Cleaning up!") 
    else: 
     print("Not cleaning up") 

if __name__ == "__main__": 
    main() 

引数グループの使用は--cleanup--no-cleanupの両方を指定して防ぐことができます。どちらのフラグも指定されていない場合、args.cleanupNoneになります。これをTrueまたはFalseに変更する場合は、--cleanup引数を相互排他的なグループに追加するときに、defaultキーワードを目的の値で追加するだけです。

Python 2.6ユーザーの場合はpip install argparseです。

+2

これは自動的に '--enable_cleanup'フラグを追加しません。それはデフォルトのアクションですが、私はその質問が両方のフラグが存在することを望んでいると思っていました... – mgilson

+0

@mgilsonが修正されました。 – wim

関連する問題