Как сделать аргумент требуется на основе другого аргумента? - PullRequest
1 голос
/ 28 апреля 2019

Учитывая небольшой синтаксический анализатор:

from argparse import ArgumentError, ArgumentParser
p = ArgumentParser()
p.add_argument('x', choices=['1', '2'])
p.add_argument('--y', required=False)
p.parse_args('1 --y 2'.split()) # this would work
p.parse_args('1'.split()) # this would work also

Однако я хочу убедиться, что если x=='1', то --y получит значение.Моя реализация была такой:

args = p.parse_args('1 --y 2'.split())
if args.x=='1' and not args.y:
     raise ArgumentError('blah')

Есть ли внутренний argparse способ сделать это?это выглядит намного лучше, когда argparse выдает ошибку разбора

Еще лучше, я хочу, чтобы аргумент --y требовался при x=='1' и не разрешался при x=='2'

1 Ответ

0 голосов
/ 16 мая 2019

‘Я хочу убедиться, что если x == '1', то --y получит значение’

Вы можете использовать это:

from argparse import ArgumentParser
from sys import argv

p = ArgumentParser(prog='MyParser')

yIsRequired = (argv[1] == '1') # True if x == '1' else False

p.add_argument('x')            # Positional argument
p.add_argument(
    '--y',                     # Optional argument
    required=yIsRequired,
)

p = p.parse_args()

Это все проверено. Этот код:

  • Чеки sys.argv для x.

  • ** Если x == '1', то yIsRequired устанавливается на True

  • y required установлено значение yIsRequired

‘Еще лучше, я хочу, чтобы --y arg был необходим, когда x == '1', и не разрешен, когда x == '2'’

Вот, пожалуйста:

from argparse import ArgumentParser
import sys

p = ArgumentParser(prog='Demo')

yIsRequired = (sys.argv[1] == '1')

p.add_argument('x')
p.add_argument(
    '--y',
    required=yIsRequired,
)

if sys.argv[1] == '2' and '--y' in sys.argv:                    # If x == 2 and y has a value
    sys.stderr.write('Demo: error: argument --y not allowed\n') # Write error to standard error output
    sys.exit(1)                                                 # Exit with non-zero exit code

p = p.parse_args()

Вывод:

  • sys.argv содержит все аргументы, переданные вашему скрипту (это list)
  • Вы можете использовать sys.argv, чтобы проверить, были ли переданы аргументы (логическая логика)
  • См. этот вопрос и this для получения справки по удалению / отключению аргументов. Ответов довольно много, но многие стоит прочитать.
...