8

を使用optparseして、負のオプションを定義する簡単な方法はあります--no-cleanupか?

None私はこの方法でそれを行いましたが、特にチェックを忘れて省略しやすいため、面倒でバグが発生しやすくなっています。

#!/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:])

Getoptions::Long理想的には、Perlのように、オプションをブール値として定義すると、それに応じてブール値変数cleanupが自動的に提供さ--cleanupれ、設定されるようなことをしたいと思います。--no-cleanup

4

1 に答える 1

4

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

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)

もちろん、これは完全なハックですが、どこに行こうとしているのかはかなり明白だと思います...ブール値を好きなように動作させることができます(ヘルプを再フォーマットし、デフォルト値を受け入れて、'--何とか' または '--no-blah' がデフォルトとして設定されているなど...)

と思います

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

if options.cleanup is Noneヘルプメッセージが繰り返されますが(私が提供したコードで)、デフォルトが設定されているため、動作し、行が表示されている間に行を削除する必要があります

特定のフラグのデフォルトを追加するだけの場合 ( のチェックを取り除くためNone)、optparse のドキュメントによると、default キーワードを add_option または OR に使用できます ...

デフォルト値を指定するより明確な方法は、OptionParser のset_defaults()メソッドです。これは、 parse_args( )を呼び出す前にいつでも呼び出すことができます。parser.set_defaults(verbose=True)

于 2012-03-29T22:31:40.387 に答える