Программа, которую я пишу, требует 1 из 3 входов.

Для 2 входов требуется дополнительный параметр. 1 вход требует 2 дополнительных параметра. Только 1 из них может быть введен одновременно.

Как я могу убедиться в этом, используя модуль argparse?

Пожалуйста, посмотрите код ниже для того, что я пробовал до сих пор.

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-d',  
      default='temp.file')

parser.add_argument('command',
      choices=['g', 's', 'm'])

args = parser.parse_args()
>>> prog.py g #  requires 1 param.
>>> prog.py s #  requires 1 param.
>>> prog.py m #  requires 2 params.
2
user11719301 8 Июл 2019 в 00:31

3 ответа

Лучший ответ

Что вы можете сделать, так это убедиться, что аргументы соответствуют вашей логике:

parser = argparse.ArgumentParser()

parser.add_argument('-d',  
                    default='temp.file')

parser.add_argument('command',
                    choices=['g', 's', 'm'])

parser.add_argument('additionals',
                    nargs='+')

args = parser.parse_args()

if args.command in ('g', 's') and len(args.additionals) != 1:
    print("Commands g and s require 1 argument")
elif args.command == 'm' and len(args.additionals) != 2:
    print("Command m require 2 arguments")

Другой способ обойти это - разделить эти команды на разные аргументы с соответствующим количеством дополнительных аргументов, которые им требуются:

parser = argparse.ArgumentParser()

parser.add_argument('-d',  
                    default='temp.file')

parser.add_argument('-g',
                    nargs=1)

parser.add_argument('-s',
                    nargs=1)

parser.add_argument('-m',
                    nargs=2)

args = parser.parse_args()

Прочитайте nargs, чтобы узнать, как использовать несколько аргументов для одного действия.

0
Tomerikoo 7 Июл 2019 в 21:50

Похоже, хорошее использование для взаимоисключающей группы

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-d',  
      default='temp.file')
mx = parser.add_mutually_exclusive_group(required=True)
mx.add_argument('-g')
mx.add_argument('-s')
mx.add_argument('-m', nargs=2)

args = parser.parse_args()
print(args)

Образцы прогонов:

1316:~/mypy$ python3 stack56926264.py -h
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)

optional arguments:
  -h, --help  show this help message and exit
  -d D
  -g G
  -s S
  -m M M

1527:~/mypy$ python3 stack56926264.py -g foo
Namespace(d='temp.file', g='foo', m=None, s=None)

1528:~/mypy$ python3 stack56926264.py -s bar
Namespace(d='temp.file', g=None, m=None, s='bar')

1528:~/mypy$ python3 stack56926264.py -m 1 2
Namespace(d='temp.file', g=None, m=['1', '2'], s=None)

И ловит некоторые ошибки:

1528:~/mypy$ python3 stack56926264.py -m 1 2 -s bar -d afile
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
stack56926264.py: error: argument -s: not allowed with argument -m

1528:~/mypy$ python3 stack56926264.py -m 1 
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
stack56926264.py: error: argument -m: expected 2 arguments

1530:~/mypy$ python3 stack56926264.py -d afile
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
stack56926264.py: error: one of the arguments -g -s -m is required
1
hpaulj 7 Июл 2019 в 22:29

g, s и m являются подкомандами, которые могут быть реализованы с использованием подпарсеров.

p = ArgumentParser()
p.add_argument('-d', default='temp.file')

subparsers = p.add_subparsers()
g_parser = subparsers.add_parser('g')
g_parser.add_argument('g_foo')

s_parser = subparsers.add_parser('s')
s_parser.add_argument('s_foo')

m_parser = subparsers.add_parser('m')
m_parser.add_argument('m_foo')
m_parser.add_argument('m_bar')

Когда вы звоните p.parse_args, тогда g_foo и др. появится в результате только при использовании соответствующей подкоманды. Например:

>>> p.parse_args(['g', '3'])
Namespace(d='temp.file', g_foo='3')
>>> p.parse_args(['m', '4', '5'])
Namespace(d='temp.file', m_foo='4', m_bar='5')
2
chepner 7 Июл 2019 в 21:53