Я не видел ничего определенного в документации argparse, утверждающей, что он может или не может переставлять.Основываясь на ваших собственных наблюдениях, где перестановка не удалась, и на следующих цитатах из документов, я собираюсь сделать вывод, что это невозможно сделать.
Уже есть модуль с явным названием ' getopt ':
Примечание Модуль getopt
представляет собой синтаксический анализатор параметров командной строки, API которого разработан для ознакомления пользователям функции C getopt()
.Пользователи, которые не знакомы с функцией C getopt()
или хотели бы написать меньше кода и получить более качественную помощь и сообщения об ошибках, должны рассмотреть возможность использования модуля argparse
.
Даже значение по умолчанию для getopt не переставляет, есть более явно определенный метод с именем gnu_getopt()
:
Эта функция работает как getopt()
, за исключением того, что режим сканирования в стиле GNUиспользуется по умолчанию.Это означает, что аргументы option и non-option могут быть смешаны.
В документации getopt приведенная выше ссылка на argparse дополнительно преувеличена включением следующего:
Обратите внимание, что эквивалентный интерфейс командной строки можно создать с меньшим количеством кода и более информативной справкой и сообщениями об ошибках с помощью модуля argparse
:
Опять же, ничего определенного, но для меня очень резкое разделение проводится между getopt и argparse с документацией, поддерживающей / пропагандирующей argparse.
Вот пример использования gnu_getop()
, который удовлетворяет вашему -z [file [file]]
тесту:
>>> args = 'file1 -z file2'.split()
>>> args
['file1', '-z', 'file2']
>>> opts, args = getopt.gnu_getopt(args, 'z')
>>> opts
[('-z', '')]
>>> args
['file1', 'file2']
Редактировать 1: Go Permute Yourself, с argparse
Вдохновлен определением «permute» на странице «Использование Getopt», с которой вы связаны,
По умолчанию переставляется содержимое argv при сканировании, чтобы в конце концов все неопции были в конце.
как насчет перестановки аргумента stпозвоните, прежде чем передать его на parse_args()
?
import argparse
p = argparse.ArgumentParser();
p.add_argument('files',nargs='*',default=['-']);
p.add_argument('-z',action='store_true')
Прокрутите свое собственное:
import re
def permute(s, opts_ptn='-[abc]'):
"""Returns a permuted form of arg string s using a regular expression."""
opts = re.findall(opts_ptn, s)
args = re.sub(opts_ptn, '', s)
return '{} {}'.format(' '.join(opts), args).strip()
>>> p.parse_args(permute('bar -z foo', '-[z]').split())
Namespace(files=['bar', 'foo'], z=True)
Использование getopt:
import getopt
def permute(s, opts_ptn='abc'):
"""Returns a permuted form of arg string s using `gnu_getop()'."""
opts, args = getopt.gnu_getopt(s.split(), opts_ptn)
opts = ' '.join([''.join(x) for x in opts])
args = ' '.join(args)
return '{} {}'.format(opts, args).strip()
>>> p.parse_args(permute('bar -z foo', 'z').split())
Namespace(files=['bar', 'foo'], z=True)