8

python optparse.py を使用して、特定のオプション値がコマンド ラインから設定されたか、デフォルト値から設定されたかを調べる方法はありますか。

理想的には、デフォルトと同じように dict を持ちたいのですが、コマンドラインから実際に提供されるオプションが含まれています

各オプションの値をデフォルトと比較できることは知っていますが、これでは、コマンドラインから渡された値がデフォルトと一致したかどうかを区別できません。

ありがとう!


編集

申し訳ありませんが、私の元の言い回しはあまり明確ではありませんでした。

バッチ ファイルから呼び出される多数のスクリプトがあります。監査の目的で、渡されたオプションと、それらがコマンド ライン、デフォルト、またはその他の手段からログ ファイルに渡されたかどうかについて報告したいと思います。

デフォルトを使用すると、オプションがデフォルト値と一致するかどうかを知ることができますが、実際にコマンド ラインから指定されたかどうかはわかりません。これは関連する可能性があります。オプションがコマンドラインから渡され、デフォルトと一致する場合、コードでデフォルトを変更しても、スクリプトは同じ値を取得します。

私にとって、実際に提供された値を含む、デフォルトと同等のものを持つことは非常に自然なことだと思います。

質問を具体的にするために、この例では:

>>> sys.argv = ['myscript.py','-a','xxx']
>>> import optparse
>>> parser = optparse.OptionParser()
>>> parser.add_option('-a', default = 'xxx')
>>> parser.add_option('-b', default = 'yyy')

オプション a がコマンド ラインから渡されたことを知るにはどうすればよいですか。コマンドラインを手動で解析する唯一の方法はありますか?

(これはかなりマイナーな点であることは承知していますが、optparse で不足している場合に備えて、質問する価値があると思いました)

再度、感謝します

4

3 に答える 3

8

以下の定型コードの代わりに:

opts, args = parser.parse_args()

opts_no_defaults以下のコードを使用すると、ユーザーが明示的に指定したオプションを持つ追加のvaluesオブジェクトが作成されます。

opts_no_defaults = optparse.Values()
__, args = parser.parse_args(values=opts_no_defaults)
opts = Values(parser.get_default_values().__dict__)
opts._update_careful(opts_no_defaults.__dict__)

最後にopts、最初のボイラープレートコードと同じである必要があります。

print opts_no_defaults.__dict__
print opts.__dict__
for opt in parser._get_all_options():
    if opt.dest:
        print "Value of %s: %s" % (opt._long_opts[0], getattr(opts, opt.dest))
        print "Is %s specified by user? %s" % (opt._long_opts[0], hasattr(opt_no_defaults, opt.dest))
于 2012-07-02T17:55:45.433 に答える
3

あなたのコードを知らないことはより良い答えを与えることは不可能ですが...

  1. 単にデフォルトをパーサーに渡さず、値をチェックしNoneます。None値はoptparselibのデフォルトであるため、独自のデフォルトを取得して通常どおりに動作できます。

  2. optparseそれを専門化するために拡張します。

私はあなたのプログラムを知りませんが、通常、構成が同じである場合、それは良い設計変更動作ではありません。

于 2010-04-07T14:54:23.663 に答える
1
def is_opt_provided (parser, dest):
   if any (opt.dest == dest and (opt._long_opts[0] in sys.argv[1:] or opt._short_opts[0] in sys.argv[1:]) for opt in parser._get_all_options()):
      return True
   return False    

使用法:

parser = OptionsParser()
parser.add_option('-o', '--opt', dest='opt_var', ...)

if is_opt_provided(parser, 'opt_var'):
   print "Option -o or --opt has been provided"

Python のメンテナが、提案された関数を OptionParser クラスに含めてくれれば素晴らしいことです。

于 2014-05-02T17:37:56.703 に答える