メインのパーサーにとって、サブパーサーの引数は選択肢を取る定位置です。ただし、残りの引数文字列もすべてサブパーサーに割り当てます。
あなたの文字列は次のように解析されると思います:
./script.py version 1 --file 1 2 3 version 3 --file 4 5 6
version
サブパーサー名として受け入れられます。 1
位置引数 の値として受け入れられますn
。(サブパーサーの)。--file
オプションの引数として (サブパーサーによって) 受け入れられます。2 番目の呼び出しの値は、最初の呼び出しの値を上書きします。私は持っていると推測し--file
ていnargs='*'
ます。その場合、最初のものは['1','2','3','version','3']
名前空間に書き込み、2 番目のものはそれを で上書きし['4','5','6']
ます。の場合nargs=3
、サブパーサーが 2 番目の でチョークすることを期待しversion
ます。これは、未知の位置として認識されます。
したがって、基本的なポイントは、「バージョン」サブパーサーが引数リストを取得すると、可能な限りすべてを解析するまで手放さないということです。この場合、両方の--file
出現を解析します。処理できないものはすべて「UNKNOWNS」としてメイン パーサーに返され、通常はエラーが発生します。
繰り返されるオプションから値が必要な場合は、追加アクションを使用します
parser.add_argument('--foo',action='append', nargs=3)
import argparse
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='version')
spp = sp.add_parser('version')
spp.add_argument('n',nargs='*',type=int)
spp.add_argument('--file',nargs=3,action='append')
str = 'version 1 --file 1 2 3 version 3 --file 4 5 6'
print(parser.parse_known_args(str.split()))
生産する
(Namespace(file=[['1', '2', '3'], ['4', '5', '6']], n=[1], version='version'), ['version', '3'])
サブパーサーへの呼び出しは 1 回だけversion
ですが、すべてのデータが存在します。
別のアプローチは、サブパーサーをネストすることです
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='sub')
spp = sp.add_parser('version')
spp.add_argument('n',nargs=1,type=int)
spp.add_argument('--file',nargs=3)
sp = spp.add_subparsers(dest='sub1')
spp = sp.add_parser('version')
spp.add_argument('n1',nargs=1,type=int)
spp.add_argument('--file',dest='file1',nargs=3)
str = 'version 1 --file 1 2 3 version 3 --file 4 5 6'
print(parser.parse_args(str.split()))
値の上書きを避けるために、「dest」を変更する必要があることに注意してください。これにより、
Namespace(file=['1', '2', '3'], file1=['4', '5', '6'], n=[1], n1=[3], sub='version', sub1='version')