CLIプログラムの引数を処理するためにArgparserを使用しています。しかし、時間が経つにつれて、それを使用するのは良い考えではないと思います。ここに問題があります。プレフィックス文字なしでオプションを使用したい。gitcommitやsvnmoveのように。少し調べてみたところ、Argparseにはadd_subparser()メソッドがあることがわかりました。fooプログラムにデータを入力しましょう:
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
次に、オプションを指定してfooを実行し、args
名前空間を出力します(コード全体を過去のものにしなかったので、要点がわかります)。
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
ご覧のとおり、オプションを実行するとdel
、add_projectは変数に渡されませんargs
。main()関数に次のような「if句」がある場合、問題が発生します。
def main(args):
if args.delete_project:
...
if args.add_project:
...
を実行すると、Namespaceにadd_projectという名前の属性がないというAttributeError例外が発生します。それ以外に、オプションとに引数を渡すことはできません。また、prefix_charsを空の文字列に設定しましたが、これも機能しませんでした。./foo del
del
add
それを処理する方法は何ですか?argparseはgit、svnなどのオプションを作成できますか?それとも独自の関数を作成してすべての引数を自分で処理する必要がありますか?