Recentemente ho riscontrato questo problema: ero su Python 2.6 e avevo bisogno di un'opzione per prendere un numero variabile di argomenti. Ho cercato di usare la soluzione di Dave, ma ha scoperto che non avrebbe funzionato senza nargs anche impostando esplicitamente a 0.
def arg_list(option, opt_str, value, parser):
args = set()
for arg in parser.rargs:
if arg[0] == '-':
break
args.add(arg)
parser.rargs.pop(0)
setattr(parser.values, option.dest, args)
parser=OptionParser()
parser.disable_interspersed_args()
parser.add_option("-f", "--filename", action="callback", callback=arg_list,
dest="file", nargs=0)
(options, args) = parser.parse_args()
Il problema era che, per impostazione predefinita, una nuova opzione aggiunta da add_options si assume di avere nargs = 1 e quando nargs> 0 OptionParser espellerà gli elementi da rarg e li assegnerà al valore prima che vengano richiamati tutti i callback. Pertanto, per le opzioni che non specificano nargs, rargs sarà sempre disattivato di uno al momento in cui viene richiamato il callback.
Questo callback può essere utilizzato per qualsiasi numero di opzioni, è sufficiente chiamare callback_args invece di setattr.
fonte
2015-06-10 21:55:18
Specificare i nomi file tramite argomenti, non tramite l'opzione: 'foo.pl a.txt b.txt c.txt -verbose' I nomi dei file verrebbero inseriti in args in questo caso. – jfs
Se --files definisce gli input, questo approccio non è raccomandato. –