2014-10-07 3 views
2

Я пытаюсь создать обязательный флаг «-f», который принимает вход «filename.pdb» в Argparse.Argparse: Создание обязательных флагов

Это достаточно просто. Стандартным решением является добавление опции «required = True».

К сожалению, после этого флаг «-f» по-прежнему отображается под дополнительными аргументами в списке справки. Еще более смутно, флаг «-f» появляется, как требуется в приглашении «use» в списке справки.

Вот мой код:

parser = argparse.ArgumentParser() 

parser.add_argument("-f", "--file_name", required=True, help="enter name of .pdb file") 

parser.add_argument("-bw", "--bin_width", default=.25, help="enter desired bin width in nanometers. default = .25") 

parser.add_argument("-bn","--base_name", default="IDP", help="custom prefix for output file naming. default = IDP") 

args = parser.parse_args() 

А вот окно справки, возвращаемый --help

usage: rgcalc.py [-h] -f FILE_NAME [-bw BIN_WIDTH] [-bn BASE_NAME] 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FILE_NAME, --file_name FILE_NAME 
        enter name of .pdb file 
    -bw BIN_WIDTH, --bin_width BIN_WIDTH 
        enter desired bin width in nanometers. default = .25 
    -bn BASE_NAME, --base_name BASE_NAME 
        custom prefix for output file naming. default = IDP 

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

Можно ли:

A) Пользовательский формат окна помощи, чтобы исправить эту

или

B) Добавить некоторый код, чтобы иметь флаг "-f", «--file_name "появляются как позиционные (против необязательного) аргумента, но все же требуют флаг?

Я читал, что Argparse намеренно сделал это, чтобы избежать позиционных флагов, но я должен сделать это, чтобы обслуживать традиционных пользователей Linux.

Спасибо, любезные interwebbers!

ответ

5

Этот вопрос обсуждался в http://bugs.python.org/issue9694, 'argparse required arguments displayed under "optional arguments"'

Это вопрос терминологии, не легко решить, из-за историческую практику (в UNIX, а также Python), и отсутствие хороших альтернатив.

Аргументы, которые принимают флаг, похожий на '-f', исторически назывались опциями или опциями. Как правило, вы не используете их, если не хотите, чтобы какое-то значение отличалось от значения по умолчанию. Но «argparse» позволяет указать required=True, так что теперь у вас есть «обязательный необязательный». И с nargs='?', возможно иметь «позиционные», которые не требуются.

Пока разработчики Python не придумают какую-либо альтернативную терминологию, ваш лучший выбор - использовать «Аргументгруппу» с названием и описанием, которое вам нравится. По умолчанию парсер имеет 2 Аргументгруппы, «необязательные аргументы» и «позиционные аргументы». Он должен поставить аргумент в том или ином. Вы можете создавать другие и заполнять их по своему усмотрению.

см. http://bugs.python.org/issue9694#msg132327 (запись оригинальным разработчиком argparse).

Линия «использования» - это то, что точно описывает, как используются аргументы, и являются ли они требуемыми или нет. «Аргументы групп» не влияют на использование или синтаксический анализ. Они просто определяют, как сгруппированы линии помощи.


Для вашего кода:

parser = argparse.ArgumentParser() 
req_grp = parser.add_argument_group(title='Required Optional') 
req_grp.add_argument("-f", "--file_name", required=True, help="enter name of .pdb file") 
parser.add_argument("-bw", "--bin_width", default=.25, help="enter desired bin width in nanometers. default = .25") 
parser.add_argument("-bn","--base_name", default="IDP", help="custom prefix for output file naming. default = IDP") 
args = parser.parse_args() 

""" 
usage: stack26227536.py [-h] -f FILE_NAME [-bw BIN_WIDTH] [-bn BASE_NAME] 

optional arguments: 
    -h, --help   show this help message and exit 
    -bw BIN_WIDTH, --bin_width BIN_WIDTH 
         enter desired bin width in nanometers. default = .25 
    -bn BASE_NAME, --base_name BASE_NAME 
         custom prefix for output file naming. default = IDP 

Required Optional: 
    -f FILE_NAME, --file_name FILE_NAME 
         enter name of .pdb file 
""" 

Сравните это с помощью полученного путем сбрасывания -f флага:

usage: stack26227536.py [-h] [-bw BIN_WIDTH] [-bn BASE_NAME] file_name 

positional arguments: 
    file_name    enter name of .pdb file 

optional arguments: 
    -h, --help   show this help message and exit 
    -bw BIN_WIDTH, --bin_width BIN_WIDTH 
         enter desired bin width in nanometers. default = .25 
    -bn BASE_NAME, --base_name BASE_NAME 
         custom prefix for output file naming. default = IDP 
+0

Очень высокий оценка. Очень всеобъемлющий и непритязательный. –

Смежные вопросы