GNU getopt и инструменты командной строки, которые его используют, позволяют чередовать параметры и аргументы, известные как параметры перестановки (см. http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt). Модуль Perl Getopt :: Long также поддерживает это (с помощью qw (: config gnu_getopt)). argparse, похоже, не поддерживает (и даже не упоминает) параметры перестановки.
Есть много SO-вопросов, связанных с порядком arg / opt, но, похоже, ни один из них не отвечает на этот вопрос: можно ли настроить argparse для перестановки порядка аргументов, например getopt?
Вариант использования - это прототипная подпись командной строки, такая как сортировка GNU:
sort [opts] [files]
в котором 1) параметры и файлы переставляются, и 2) список файлов может содержать ноль или более аргументов.
Например:
import argparse
p = argparse.ArgumentParser();
p.add_argument('files',nargs='*',default=['-']);
p.add_argument('-z',action='store_true')
p.parse_args(['-z','bar','foo']) # ok
p.parse_args(['bar','foo','-z']) # ok
p.parse_args(['bar','-z','foo']) # not okay
usage: ipython [-h] [-z] [files [files ...]]
Я пробовал:
- p.parse_known_args - не жалуется, но на самом деле также не переставляет и не возражает против аргументов, которые выглядят как недопустимые параметры (например, --bogus или -b выше).
- p.add_argument ('files', nargs = argparse.REMAINDER) - опция -z включается в файлы, если только перед позиционными аргументами
- p.add_argument ('файлы', nargs = '*', действие = 'добавить');
Я хочу реализовать что-то близкое к прототипу сортировки GNU выше. Меня не интересует флаг, который можно указывать для каждого файла (например, -f file1 -f file2).