Задать вопрос
@V-ampre

Можно ли в argparse сделать позиционный аргумент необязательным?

Например вводим два значения и сравниваем их, но хотим иметь возможность ввести значения в терминале либо прочитать из файла.
Такой код при запуске командой
python main.py compare -xfile xfile.txt -yfile xfile.txt
выдает ошибку о том что требуются x и y:
# main.py
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='tools')
parser_tool = subparsers.add_parser('compare')
parser_tool.add_argument('x')
parser_tool.add_argument('y')
# Или например хочу читать аргументы из файлов
parser_tool.add_argument('-xfile')
parser_tool.add_argument('-yfile')


Но возьмем pip и там мы можем либо pip install lib_name либо pip install -r requirements.txt
Посмотрел исходник pip и так понял что там используется click, а можно ли реализовать такое поведение на argparse?
  • Вопрос задан
  • 158 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@V-ampre Автор вопроса
Все вопрос снимается, цитирую:

Arguments containing -

The parse_args() method attempts to give errors whenever the user has clearly made a mistake, but some situations are inherently ambiguous. For example, the command-line argument -1 could either be an attempt to specify an option or an attempt to provide a positional argument. The parse_args() method is cautious here: positional arguments may only begin with - if they look like negative numbers and there are no options in the parser that look like negative numbers:
>>>

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')

>>> # no negative number options, so -1 is a positional argument
>>> parser.parse_args(['-x', '-1'])
Namespace(foo=None, x='-1')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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