3

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)

ご覧のとおり、オプションを実行するとdeladd_projectは変数に渡されませんargs。main()関数に次のような「if句」がある場合、問題が発生します。

def main(args):

   if args.delete_project:
      ...
   if args.add_project:
      ...

を実行すると、Namespaceにadd_projectという名前の属性がないというAttributeError例外が発生します。それ以外に、オプションとに引数を渡すことはできません。また、prefix_charsを空の文字列に設定しましたが、これも機能しませんでした。./foo deldeladd

それを処理する方法は何ですか?argparseはgit、svnなどのオプションを作成できますか?それとも独自の関数を作成してすべての引数を自分で処理する必要がありますか?

4

2 に答える 2

0

編集:どうやらのデフォルトはです。これdefaultNone、がないことを意味するので、andを使用する必要がありますTrueFalseとにかく正しい方法です)。

default引数をパーサーに追加するときに、を追加する必要があります。

parser_a.add_argument('-ap', '--add-project',
                    nargs = '*',
                    action = 'store_true',
                    default = False,
                    help = "Add project")

add_argumentメソッドのドキュメントはこちらでご覧いただけます。(私は、argparseドキュメントのレイアウトが、例で呼び出されていないことを行う方法を理解するのに最も役立つわけではないことを理解しています)

また、Tobuが彼の回答で適切に指摘しているように、未使用のサブパーサーは呼び出されないため、少なくともtry:ブロック内のコードを保護しない限り、それらの値を安全にプローブすることはできません。ただし、実際には、action状態を共有する必要があるはるかに複雑な状況がない限り、をサブパーサーに関連付ける機能を使用する必要があります。

于 2010-12-06T21:01:40.950 に答える
0

ifステートメントの代わりに、argparseドキュメントは次のようなものを推奨しています

parser_X.set_defaults(action=action_func)
args.action(args)

次に、add_actionはadd_projectを調べ、del_actionはdel_projectを調べます。

于 2010-12-06T21:03:03.290 に答える