У меня недавно возникла эта проблема: я был на Python 2.6 и мне нужно было принять переменное число аргументов. Я попытался использовать решение Дейва, но обнаружил, что оно не будет работать без явного задания nargs равным 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()
Проблема заключалась в том, что по умолчанию предполагается, что новая опция, добавленная add_options, имеет nargs = 1, а когда nargs> 0 OptionParser извлекает элементы из rargs и присваивает им значение до вызова любых обратных вызовов. Таким образом, для опций, которые не определяют nargs, rargs всегда будет отключен на единицу к моменту вызова вашего обратного вызова.
Этот обратный вызов может использоваться для любого числа опций, просто для callback_args следует использовать функцию, которая будет вызываться вместо setattr.