2010-12-06 8 views
2

私は、CLI progの引数を処理するためにArgparserを使用しています。しかし、時間が経つと、私はそれを使うのは良い考えではないと思う。ここで問題が起こる。私は接頭辞文字なしでオプションを使いたい。いいえgitコミットまたはsvn moveのように。私は少し調べて、Argparseにadd_subparser()メソッドがあることを発見しました。私たちは私たちのFOO PROGを移入してみましょう:Argparserに接頭辞なしでオプションを設定する方法はありますか?

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() 

は今オプションと印刷args名前空間(私が過去に全体のコードはなかった、あなたはポイントを得る)とのfooを実行してみましょう:

$ ./foo del 
Namespace(delete_project=None) 
$ ./foo add 
Namespace(add_project=None) 

ご覧のとおり、delというオプションを実行すると、のadd_projectは変数argsに渡されません。それは私が

def main(args): 

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

のように私のmain()関数で「if節」を持っている場合、私は私が実行した場合、名前空間は、名前add_projectを持つ属性を持っていないことを、はAttributeError例外を取得します問題が発生します./foo del。それ以外に、私はオプションdeladdに引数を渡すことができません。また、prefix_charsに空の文字列を設定しましたが、それもうまくいきませんでした。

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

答えて

0

の代わりにあなたの文、the argparse docs recommend something like this場合:

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

はその後add_actionはdel_projectでadd_project、およびdel_actionを見ていきます。

+0

それは絶対にあります。OPは、ユーザーが呼び出さなかったサブパーザーで属性エラーを取得しています。実際に使用されているサブパーターを調べる方法を説明しました。 – Tobu

+0

Bah、私の間違い、私は完全に 'subparser'を逃した。 @Nick Heh。 –

+0

それは少し簡潔でした、私は説明を残しています。 – Tobu

0

編集:どうやらdefaultのデフォルトは、我々は1を持っていないことを意味する、Noneあるので、あなたは(とにかく正しい方法です)TrueFalseを使用する必要があります。

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

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

あなたはadd_argument方法hereのマニュアルを参照してくださいすることができます。東武は適切に彼の答えで指摘するように、未使用のsubparsersは「ドン、また

(私は​​ドキュメントのレイアウトを例に呼び出されていない物事を行う方法を考え出すに最も資するものであると認識します) try:ブロックでコードを保護することなく、安全に値を検証することはできません。しかし、実際には、状態を共有する必要があるはるかに複雑な状況がない限り、actionをサブパーザに関連付ける機能を使用する必要があります。

+1

* add_argument()のデフォルトのキーワード引数。デフォルト値はNoneです...この問題は解決しません。私が 'foo del'を実行するとadd_projectを渡すことはありません –

+0

@Farslan:Bah、本当にあなたは' True'と 'False'を使用するように強制されます(実際には' store_true'と 'store_false'をあなたのアクションに入れます) –

関連する問題