1. ホーム
  2. python

[解決済み] argparse: どのサブパーサーが使用されたかを特定する [重複].

2022-04-13 12:51:43

質問

私はこれが簡単でなければならないと思うが、私はそれを得ることはありません。

以下のようなarparseパーサがあるとします。

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')

どのサブパーサーが使用されたかを特定するにはどうすればよいですか? を呼び出すことができます。

print parser.parse_args(["all"])

は空の名前空間を与えてくれます。

Namespace()

解決方法は?

編集する。 ご覧ください Quornianの回答 は、私のより優れた回答であり、受け入れられるべきものです。

によると argparse ドキュメント の結果は parser.parse_args(...) は、メイン パーサーと選択されたサブ パーサーの属性を含むだけです。残念ながら、これはどのサブパーサーが使用されたかを判断するのに十分な情報ではないかもしれません。ドキュメントでは set_defaults(...) メソッドでこの問題を解決できます。

例えば set_defaults() をあなたのコードに追加してください。

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')

ここで

print parser.parse_args(["all"])

その結果は

Namespace(which='all')

をチェックしてください。 add_subparsers() のドキュメントを参照してください。