Настройка argparse на Python 3.2 - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь настроить argparse на моей программе на python, но она не работает. Аргументы, которые я пытаюсь обработать, таковы:

Либо '--interactive', либо целое число для первого аргумента, требуется один из них

Любой из '--xml' ИЛИ ​​--html 'ИЛИ' --text 'ИЛИ' --console '. Опять же, это может быть любой из них, но для второго аргумента требуется один из них

И, наконец, третий аргумент - флаг '--verbose', который является необязательным.

Все эти аргументы изменяют переменные на True, кроме целого числа в первом аргументе.

Это код, который у меня есть на минуту:

import argparse

parser = argparse.ArgumentParser(description='Python Historical Event Calculator.',
                             prog='tempus.py')

inputs = parser.add_mutually_exclusive_group(required=True)
exports = parser.add_mutually_exclusive_group(required=True)

inputs.add_argument('integer', metavar='I', type=float,
               help='percentage to use')

inputs.add_argument('-i','--interactive', dest='bool_interactive', 
               action='store_true', help='enter interactive mode')

exports.add_argument('-x','--xml', dest='bool_xml', action='store_true',
               help='export output as xml')

exports.add_argument('--html', dest='bool_html', action='store_true',
               help='export output as html')

exports.add_argument('-t','--text', dest='bool_text', action='store_true',
               help='export output as plaintext')

exports.add_argument('-c','--console', dest='bool_con', action='store_true',
               help='export output to console')

parser.add_argument('-v','--verbose', dest='verbose', action='store_true',
               help='enter verbose/debug mode', required=False)

args = parser.parse_args()

Но я понятия не имею, нахожусь ли я на правильном пути с этим, хотя, кто-нибудь может помочь? Это выглядит правильно или я сделал это совершенно неправильно?

Редактировать

Я получаю эту трассировку, когда передаю ему любой флаг:

Traceback (most recent call last):
  File "C:\Users\Callum\Dropbox\Tempus\Feature Tests\argparsetest.py", line 9, in <module>
    help='percentage to use')
  File "C:\Python32\lib\argparse.py", line 1305, in add_argument
    return self._add_action(action)
  File "C:\Python32\lib\argparse.py", line 1528, in _add_action
    raise ValueError(msg)
ValueError: mutually exclusive arguments must be optional

Ответы [ 2 ]

4 голосов
/ 24 февраля 2012

Ваша ошибка, ValueError: mutually exclusive arguments must be optional, произошла потому, что вы добавляете integer (позиционный аргумент) во взаимоисключающую группу. Взаимоисключающие группы предназначены только для необязательных аргументов, тогда как позиционные аргументы всегда требуются. Одним из решений является создание необязательных аргументов interactive и integer и их взаимоисключение.

Изначально я упустил тот факт, что вы использовали mutually_exclusive_group в своих режимах, так что были указаны только xml, html, console или text, но я изменил его, если вам нравится эта идея.

Этот парсер будет работать, он сделает ваши аргументы interactive и integer взаимоисключающими и сделает режим список выбора .

#!/usr/bin/env python

import argparse

def get_parser():
    parser = argparse.ArgumentParser(prog='tempus.py')
    ex_group = parser.add_mutually_exclusive_group(required=True)
    parser.add_argument('--mode', type=str, choices=['html', 'xml', 'text', 'console'], required=True)
    parser.add_argument('-v', '--verbose', action='store_true')
    ex_group.add_argument('--interactive', action='store_true')
    ex_group.add_argument('--integer', metavar='I', type=float, help='percentage to use')
    return parser

def main():
    aparser = get_parser()
    args = aparser.parse_args()

    print('mode: %s' % args.mode)
    print('integer: %s' % args.integer)
    print('interactive: %s' % args.interactive)
    print('verbose: %s' % args.verbose)

# Only used in Python 2.x
if __name__ == '__main__':
    main()

Пример прогона:

+> python .\tempus.py
usage: tempus.py [-h] --mode {html,xml,text,console} [-v]
                 (--interactive | --integer I)
tempus.py: error: argument --mode is required

+> python .\tempus.py --mode html
usage: tempus.py [-h] --mode {html,xml,text,console} [-v]
                 (--interactive | --integer I)
tempus.py: error: one of the arguments --interactive --integer is required

+> python .\tempus.py --mode html --integer
usage: tempus.py [-h] --mode {html,xml,text,console} [-v]
                 (--interactive | --integer I)
tempus.py: error: argument --integer: expected one argument

+> python .\tempus.py --mode html --integer 12
mode: html
integer: 12.0
interactive: False
verbose: False
0 голосов
/ 29 июля 2013

Измените integer на необязательный positional

inputs.add_argument('integer', nargs='?', metavar='I', type=float, ...)

При этом -i и 33 будут приняты группой inputs, -i 33 не будет.

...