11

これは、異なる観点からは、argparseモジュールを使用した2つの相互に排他的なオプションのPythonでのデフォルトオプションの設定によく似ていることを理解しています(そしてそこに与えられた答えは役に立たないようです)。

コードブロック(パーサーはargparse.ArgumentParserのインスタンスです):

mutex_group = parser.add_mutually_exclusive_group()
mutex_group.add_argument("--show", action="store_true", 
    dest="show", default=True)
mutex_group.add_argument("--insert", action="store_true", 
    dest="insert")

opts = parser.parse_args()

どちらも指定されていない場合、--showまたは指定されていない場合--insertはデフォルトで--show(したがってdefault=True)に設定しますが、--insert使用されている場合はopts.show、相互に排他的なブロックの一部であるにもかかわらず、(デフォルトのために)trueに設定されます。

opt.show現在のコードは、Trueであるかどうかをテストするときに、他のオプションが設定されていないことを確認します。

if opts.show and not opts.insert:
    do_something()
elif opts.insert:
    do_something_else()

ただし、これはスケーリングされないため(相互に排他的なグループに追加するとどうなるかなど) 、デフォルトのままにして、--delete他のすべての変数をfalseにするより良い方法を探しています。opts.show

argparseのドキュメントを読むと、カスタムアクションが進むべき道だと思いますが、その中から相互に排他的なグループの他のメンバーにアクセスする方法がわかりません(理論的には、それらを繰り返し処理し、デフォルトを反転させることができます。残りのいずれかが設定されました)。もう1つのオプションは、if条件を逆にすることですが、これはクリーンではないようです(デフォルトが変更された場合、ifステートメントの順序も変更する必要があります)。

4

1 に答える 1

21

おそらく'store_const'より適切なアクション(すべての引数が同じ宛先を指している)であると私は思います。

import argparse
parser = argparse.ArgumentParser()
mutex_group = parser.add_mutually_exclusive_group()
mutex_group.add_argument("--show", action="store_const", 
    dest="mutex", const="show")
mutex_group.add_argument("--insert", action="store_const", 
    dest="mutex", const="insert")
mutex_group.add_argument('--delete', action="store_const",
    dest="mutex", const="delete")


parser.set_defaults(mutex='show')
args = parser.parse_args()
print(args)

args.mutexこれで、実行するアクションを把握するために使用できます。

于 2012-09-06T15:58:35.033 に答える