2017-12-18 23 views
0

私は2つのプログラムを持っています.1つはもう一方のラッパーです。python/argparseから引数を取り除く(parse_known_argsを使わずに)

メインプログラムは引数の順序、引数-1を持っている、--arg1、--arg2 ラッパープログラムは、すべてのメインプログラムの引数、および追加の引数--arg3があり、--arg4

私はなりたいです'引数が認識されない'というエラーを出さずに、ラッパーからメインプログラムに引数を渡すことができます。しかし、私はではないは、typoを作成したか無意味な引数を使用した場合にゼロフィードバックを受け取るので、parse_known_argsを使用します。 (私はすでにthis questionを見たことがあります)

1つの引数名ごとに手動で検索する以外に、名前が存在する場合はその名前の直後に値があり、その後にパラメータが必要な引数がある場合は、いくつかの値の集合を別のパーサーに渡すために、私の議論を掃除するエレガントな方法ですか?

+1

何が起こっているのかを明確にするために、いくつかのサンプルコードを与えます。ラッパーがすべての引数を処理する場合、メインが処理できないものを無視するかどうかは関係ありません。リンクされた回答では、最初のパーサーはpartialを使用し、2番目のパーサーにはエクストラを渡します。 'arg3/4'をキャプチャし、残りを' extras'として渡すダミーパーサーを試すことができます。 – hpaulj

答えて

1

様々な部分parsings混合の例:

import argparse 

def foo(parser, alist): 
    for arg in alist: 
     parser.add_argument('--'+arg, action='store_true') 

parser1 = argparse.ArgumentParser() 
foo(parser1, ['arg1','arg2']) 

parser2 = argparse.ArgumentParser() 
foo(parser2, ['arg3','arg4']) 

parser12 = argparse.ArgumentParser() 
foo(parser12, ['arg1','arg2','arg3','arg4']) 

args = parser12.parse_args() 
print('p12', args) 

args, extras = parser2.parse_known_args() 
print('p2',args, extras) 

args = parser1.parse_args(extras) 
print('p1',args) 

args, extras = parser1.parse_known_args() 
print('p1p',args, extras) 

なし:

1714:~/mypy$ python3 stack47866170.py 
p12 Namespace(arg1=False, arg2=False, arg3=False, arg4=False) 
p2 Namespace(arg3=False, arg4=False) [] 
p1 Namespace(arg1=False, arg2=False) 
p1p Namespace(arg1=False, arg2=False) [] 

全:

1722:~/mypy$ python3 stack47866170.py --arg1 --arg2 --arg3 --arg4 
p12 Namespace(arg1=True, arg2=True, arg3=True, arg4=True) 
p2 Namespace(arg3=True, arg4=True) ['--arg1', '--arg2'] 
p1 Namespace(arg1=True, arg2=True) 
p1p Namespace(arg1=True, arg2=True) ['--arg3', '--arg4'] 

サブセットを

1723:~/mypy$ python3 stack47866170.py --arg1 --arg2 
p12 Namespace(arg1=True, arg2=True, arg3=False, arg4=False) 
p2 Namespace(arg3=False, arg4=False) ['--arg1', '--arg2'] 
p1 Namespace(arg1=True, arg2=True) 
p1p Namespace(arg1=True, arg2=True) [] 
1723:~/mypy$ python3 stack47866170.py --arg1 --arg3 
p12 Namespace(arg1=True, arg2=False, arg3=True, arg4=False) 
p2 Namespace(arg3=True, arg4=False) ['--arg1'] 
p1 Namespace(arg1=True, arg2=False) 
p1p Namespace(arg1=True, arg2=False) ['--arg3'] 

エラー - parser12によってキャッチ:

1724:~/mypy$ python3 stack47866170.py --arg1 --foo 
usage: stack47866170.py [-h] [--arg1] [--arg2] [--arg3] [--arg4] 
stack47866170.py: error: unrecognized arguments: --foo 
+0

これはオプションの引数だけではうまくいきますが、各パーサーの定位置の引数がある場合は解決策ではありません... – dWitty

+0

を受け入れると、複数のパーサーを使用すると位置がハードハンドルになります。それらを解析すればうまくいくかもしれません。 – hpaulj

関連する問題