Как распечатать интерфейс справки по argparse с двумя позиционными аргументами?

Я изучаю основы argparse и написал программу, которая печатает информацию о солнечной системе в командной строке, однако я использовал 2 позиционных аргумента, что вызывает некоторые сложности. Моя цель - распечатать интерфейс «помощь», когда в командную строку вводится неизвестный аргумент, но это невозможно из-за использования нескольких позиционных аргументов. Об использовании необязательных аргументов сейчас не может быть и речи.

Как распечатать справку по неизвестным аргументам? Насколько я понимаю, планету не нужно называть конкретно «планетой», а что угодно и имя планеты впоследствии, поэтому мне было трудно это сделать.


person cact1    schedule 15.03.2016    source источник
comment
Ваш текущий набор аргументов довольно странный. Вам действительно нужно, чтобы программа могла одновременно перечислять (своего рода подкоманда) и отображать информацию о выбранной планете? Либо сделайте подкоманды list и display, либо сделайте list флагом, даже если вы говорите, что об этом не может быть и речи.   -  person Ilja Everilä    schedule 15.03.2016
comment
Обычно мы ожидаем, что вопросы argparse будут включать parser в том виде, как они определены до сих пор, а также некоторые примеры командных строк и желаемый анализ. По такому тексту трудно сказать, что вы хотите и что вы пробовали.   -  person hpaulj    schedule 15.03.2016
comment
Аргумент, позиционный или помеченный, может принимать параметр choices, например. choices=['mercury', 'venus', 'earth', ...].   -  person hpaulj    schedule 15.03.2016


Ответы (2)


Возможно, вам нужна взаимоисключающая группа. .

parser = argparse.ArgumentParser(description="About the Solar System") # initialises argparse

parser.add_argument("--orderby", help="displays the planets ordered by mass, largest to smallest", action='store_true')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--list", help="displays the planets in alphabetical order", action='store_true')
group.add_argument("planet", help="displays information on the chosen <planet> and opens a wiki page", nargs="?", action="store")

args = parser.parse_args()

что привело бы к

 % python3 args.py 
usage: args.py [-h] [--orderby] (--list | planet)
args.py: error: one of the arguments --list planet is required

а также

 % python3 args.py --list
Namespace(list=True, orderby=False, planet=None)

 % python3 args.py asdf  
Namespace(list=False, orderby=False, planet='asdf')

 % python3 args.py --list asdf
usage: args.py [-h] [--orderby] (--list | planet)
args.py: error: argument planet: not allowed with argument --list
person Ilja Everilä    schedule 15.03.2016

Вы хотели бы поднять argParse.ArgumentTypeError с пользовательским типом, здесь есть базовый пример, как это сделать: структура выбора argparse допустимых значений

person Nicholas Smith    schedule 15.03.2016