У меня недавно возникла эта проблема: я работал на 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.
person
Jeremy Paige
schedule
10.06.2015
foo.pl a.txt b.txt c.txt --verbose
в этом случае имена файлов будут помещены в аргументы. - person jfs   schedule 22.06.2009