Вопрос по python – Отключить сокращение в argparse

12

argparse использует аббревиатуру по умолчанию в однозначных случаях.

Я не хочу сокращений, и я бы хотел их отключить. Но не нашел вдокументаци.

Является ли это возможным

Пример

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--send', action='store_true')
parser.parse_args(['--se']) # returns Namespace(send=True)

Но я хочу, чтобы это было правдой только тогда, когда указан полный параметр. Чтобы предотвратить ошибки пользователя.

ОБНОВИТЬ

Я создалticket на python bugtracker после ответа Викаса. И это уже было обработано.

Ваш Ответ

4   ответа
6

вы можете отключить сокращения, запустив ArgumentParser с помощью следующего:

parser = argparse.ArgumentParser(allow_abbrev=False)

Также см документация.

Я выбрал это как правильный ответ, потому что теперь он более уместен. jens
Хотя первоначальный вопрос был задан более 3 лет назад, на сегодня это правильный ответ. jdferreira
4

Сначала я заглянул в документацию - безрезультатно.

Затем я открыл Lib \ argparse.py и просмотрел исходный код. Опуская много деталей, кажется, что каждый аргумент анализируется регулярным выражением, подобным этому (argparse: 2152):

    # allow one or more arguments
    elif nargs == ONE_OR_MORE:
        nargs_pattern = '(-*A[A-]*)'

Это регулярное выражение успешно проанализирует и '-', и '-', поэтому мы не можем контролировать короткие и длинные аргументы. Другие регулярные выражения также используют конструкцию - *, поэтому она не зависит от типа параметра (без под-аргументов, 1 под-аргумента и т. Д.).

Позднее в коде двойные черты кода преобразуются в одну черту (только для необязательных аргументов), опять же, без каких-либо флагов для управления пользователем:

    # if this is an optional action, -- is not allowed
    if action.option_strings:
        nargs_pattern = nargs_pattern.replace('-*', '')
        nargs_pattern = nargs_pattern.replace('-', '')
Хорошее исследование Maria Zverina
Я не думаю, что проблема связана с короткими и длинными опциями. Vikas
4

Фрагмент кода @ Владимир опубликовал, я думаю, это не то, что вы ищете. Фактический код, который делает это:

def _get_option_tuples(self, option_string):
    ...
    if option_string.startswith(option_prefix):
    ...

Смотри чекstartswith не==.

И вы всегда можете расширитьargparse.ArgumentParser чтобы предоставить свой собственный_get_option_tuples(self, option_string) чтобы изменить это поведение. Я только что сделал, заменив два вхожденияoption_string.startswith(option_prefix) вoption_string == option_prefix а также

>>> parser = my_argparse.MyArgparse
>>> parser = my_argparse.MyArgparse()
>>> parser.add_argument('--send', action='store_true')
_StoreTrueAction(option_strings=['--send'], dest='send', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args(['--se'])
usage: [-h] [--send]
: error: unrecognized arguments: --se

Слово предостережения

Метод_get_option_tuples имеет префикс_, что обычно означает закрытый метод в python. И не стоит переопределять частное.

да это было то, что я искал. Спасиб jens
3

что хочешь узнать--dog без сокращения.

p = argparse.ArgumentParser()
p.add_argument('--dog')
p.add_argument('--dox', help=argparse.SUPPRESS, metavar='IGNORE')

Добавив второй аргумент--dox который отличается от аргумента, который вы хотите, только третьей буквой,--d а также--do стать неоднозначным. Поэтому парсер откажется их распознавать. Вам нужно добавить код, чтобы перехватить полученное исключение и обработать его в соответствии с контекстом, в котором вы вызываетеparse_args. Возможно, вам также придется подавить / настроить текст справки.

Thehelp=... исключает аргумент из списка опций в сообщении помощи по умолчанию (заэт), а такжеmetavar='IGNORE' просто чтобы прояснить, что вы действительно ничего не делаете с этой опцией :).

@ 2rs2ts Еще один вариант для вас. cxw
Да, это будет полезно для меня, так как у меня даже нет доступа к Python 3.5 через мои текущие репозитории apt. Благодарность 2rs2ts

Похожие вопросы