argparse: Обязательный список параметров add_mutually_exclusive_group как необязательный? - PullRequest
2 голосов
/ 16 января 2020

Я знаю, что argparse описывает в своей документации , что параметры, начинающиеся с - или --, считаются необязательными:

В общем, модуль argparse предполагает, что флаги типа -f и --bar указывают необязательные аргументы, которые всегда могут быть опущены в командной строке.

Независимо от того, определяете ли вы параметры как необходимые или нет, они будут отображаются в « необязательные аргументы » в выводе справки argparse:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--required_argument', action='store_true',  required=True)
parser.add_argument('--optional_argument', action='store_false', required=False)
parser.add_argument('positional_argument')
args = parser.parse_args()

Это приводит к следующему выводу справки:

usage: demo.py [-h] --required_argument [--optional_argument] positional_argument

positional arguments:
  positional_argument

optional arguments:
  -h, --help           show this help message and exit
  --required_argument
  --optional_argument

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

Я уже знаю, что есть обходной путь для этого, используя add_argument_group () , например так:

import argparse

parser = argparse.ArgumentParser()
group1 = parser.add_argument_group(title='required arguments')
group1.add_argument('--required_argument', action='store_true',  required=True)
parser.add_argument('--optional_argument', action='store_false', required=False)
parser.add_argument('positional_argument')
args = parser.parse_args()
usage: demo.py [-h] --required_argument [--optional_argument] positional_argument

positional arguments:
  positional_argument

optional arguments:
  -h, --help           show this help message and exit
  --optional_argument

required arguments:
  --required_argument

Но как добиться аналогичной вещи, если у вас есть взаимоисключающие аргументы? Предположим, вам нужно предоставить один из двух аргументов, но не оба одновременно. Я знаю, что есть лучшие варианты, как в этом примере, но ради этого: Когда вам нужно, чтобы пользователь использовал либо --enable, либо --disable: нужно предоставить один, но оба не имеют смысла.

Если это реализовано следующим образом, я не знаю, как сделать так, чтобы он не попадал под " необязательные аргументы ", поскольку add_mutually_exclusive_group () не поддерживается аргументы "title" и "description" add_argument_group () :

Обратите внимание, что в настоящее время взаимоисключающие группы аргументов не поддерживают аргументы title и description add_argument_group ( ) .

import argparse

parser = argparse.ArgumentParser()
group1 = parser.add_mutually_exclusive_group(required=True)
group1.add_argument('--enable',  action='store_true',  help='Enable something')
group1.add_argument('--disable', action='store_false', help='Disable something')
args = parser.parse_args()
usage: demo.py [-h] (--enable | --disable)

optional arguments:
  -h, --help  show this help message and exit
  --enable    Enable something
  --disable   Disable something

Итак, кто-нибудь знает решение с помощью argparse или это запрос showtopper, и нужно переключиться на что-то еще, например нажмите

1 Ответ

0 голосов
/ 16 января 2020

Обратите внимание на примечание по параметру required :

Примечание : Обязательные параметры обычно считаются неверными, поскольку пользователи ожидают параметры должно быть необязательно , и поэтому их следует избегать, когда это возможно.

Так что не используйте обязательные опции; вместо этого используйте позиционные аргументы с choices или подпарсером. Вот пример с позиционерами, который, как вы заметите, гораздо проще:

import argparse

parser = argparse.ArgumentParser(prog='demo.py')
parser.add_argument('action', choices=['enable', 'disable'], help='Action to take')

parser.print_help()

for arg in ['enable', 'disable', 'rotate']:
    print()
    print(parser.parse_args([arg]))

Вывод:

usage: demo.py [-h] {enable,disable}

positional arguments:
  {enable,disable}  Action to take

optional arguments:
  -h, --help        show this help message and exit

Namespace(action='enable')

Namespace(action='disable')

usage: demo.py [-h] {enable,disable}
demo.py: error: argument action: invalid choice: 'rotate' (choose from 'enable', 'disable')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...