17

次のようなコードがあります。

list_of_choices = ["foo", "bar", "baz"]
parser = argparse.ArgumentParser(description='some description')
parser.add_argument("-n","--name","-o","--othername",dest=name,
    choices=list_of_choices

出力として得られるものは次のようになります。

-n {foo,bar,baz}, --name {foo,bar,baz}, -o {foo,bar,baz}, 
--othername {foo,bar,baz}

私が欲しいのは:

-n, --name, -o, --othername {foo,bar,baz}

文脈上、同じオプションに 2 つの名前が必要であり、実際の選択肢のリストが 22 要素の長さであるため、上記よりもはるかに悪いように見える歴史的な理由があります。

この問題は、 Python argparseとは微妙に異なります。選択肢が多いと、2 つの個別のオプションを使用していないという点でヘルプの出力が見苦しくなります。

4

3 に答える 3

16

add_arguments()複数が必要で、選択肢が必要な場所にのみ設定する場合があると思いますchoices

list_of_choices = ["foo", "bar", "baz"]
parser = argparse.ArgumentParser(description='some description')
parser.add_argument("-n")
parser.add_argument("--name")
parser.add_argument("-o")
parser.add_argument("--othername", dest='name',
    choices=list_of_choices)
于 2012-11-20T18:24:34.963 に答える
4

ありがとう、@トーマス・シュルツ。add_argument のシーケンシャルな側面を認識していませんでした。あなたのコメントは、他のスレッドからのコメントと組み合わされて、私を正しい軌道に乗せました。

基本的に、私が今行っていることは、4 つすべてをミューテックス グループに入れ、最初の 3 つの出力を抑制してから、それらをグループの説明に含めることです。

出力は次のようになります。

group1
   use one of -n, --name, -o, --othername
-n {foo,bar,baz}

これはオリジナルよりもはるかにクリーンです。

于 2012-11-20T19:15:37.733 に答える
1

もう少し微調整して落ち着いたコードは次のとおりです。

parser = argparse.ArgumentParser(description='some description', 
    epilog="At least one of -n, -o, --name, or --othername is required"
           " and they all do the same thing.") 
parser.add_argument('-d', '--dummy', dest='dummy',
    default=None, help='some other flag')
stuff = parser.add_mutually_exclusive_group(required=True)
stuff.add_argument('-n', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS)
stuff.add_argument('-o', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS)
stuff.add_argument('--name', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS)
stuff.add_argument('--othername', dest='name', 
    action='store', choices=all_grids, help='')
args = parser.parse_args()

-h使用法、次にオプションリスト、次にこれを含む出力:

--othername {foo,bar,baz}

At least one of -n, -o, --name, or --othername is required and they all do the same thing.
于 2012-11-20T20:20:02.307 に答える