In un primo momento ho pensato lo stesso di jcollado, ma poi c'è il fatto che, se le successive (livello superiore) argomenti posizionali hanno una specifica nargs
(nargs
= None
, nargs
= intero), quindi funziona come previsto. Fallisce quando nargs
è '?'
o '*'
e talvolta quando è '+'
. Così, sono andato giù al codice, per capire cosa sta succedendo.
Si riduce al modo in cui gli argomenti sono suddivisi per essere consumati. Per capire chi ottiene cosa, la chiamata a parse_args
riepiloga gli argomenti in una stringa come 'AA'
, nel tuo caso ('A'
per argomenti posizionali, 'O'
per facoltativo) e finisce per produrre un modello di espressioni regolari da abbinare a quella stringa di riepilogo, in base sulle azioni che hai aggiunto al parser tramite i metodi .add_argument
e .add_subparsers
.
In ogni caso, per l'esempio, la stringa argomento termina con 'AA'
. Ciò che cambia è il modello da abbinare (è possibile vedere i possibili modelli sotto _get_nargs_pattern
in argparse.py
. Per subpositional
si finisce per essere '(-*A[-AO]*)'
, il che significa permettono un argomento seguito da un qualsiasi numero di opzioni o argomenti.Per positional
, dipende dal valore trasmesso a nargs
:
None
=>'(-*A-*)'
- 3 =>
'(-*A-*A-*A-*)'
(uno '-*A'
per argomento expected)
'?'
=>'(-*A?-*)'
'*'
=>'(-*[A-]*)'
'+'
=>'(-*A[A-]*)'
quei modelli vengono aggiunti e, per nargs=None
(il vostro esempio di lavoro), si finisce con '(-*A[-AO]*)(-*A-*)'
, che corrisponde a due gruppi ['A', 'A']
. In questo modo, subpositional
analizzerà solo subpositional
(cosa volevi), mentre positional
corrisponderà all'azione.
Per nargs='?'
, si finisce con '(-*A[-AO]*)(-*A?-*)'
. Il secondo gruppo è interamente composto da modelli opzionali e *
è avido, ovvero il primo gruppo globifica tutto nella stringa, fino a riconoscere i due gruppi ['AA', '']
. Ciò significa che subpositional
ottiene due argomenti e finisce per soffocare, ovviamente.
Abbastanza divertente, il modello per nargs='+'
è '(-*A[-AO]*)(-*A[A-]*)'
, che funziona finché si passa solo un argomento. Dì subpositional a
, poiché hai bisogno di almeno un argomento posizionale nel secondo gruppo. Ancora una volta, dato che il primo gruppo è avido, passare subpositional a b c d
ti dà ['AAAA', 'A']
, che non è quello che volevi.
In breve: un casino. Credo che questo dovrebbe essere considerato un errore, ma non sono sicuro che l'impatto sarebbe se i modelli si trasformano in quelli non-avidi ...
Btw, sembra un [noto bug ] (http://bugs.python.org/issue9340), che è stato corretto per le recenti versioni di Python. –