Простой способ настроить сокращения с Argh - PullRequest
0 голосов
/ 08 марта 2012

Я использую библиотеку argh для создания инструмента командной строки python. Некоторые из названий, которые я использую, оказались довольно длинными, например ::1001

./my_program.py download-and-parse-data --randomize-order --training-percent 80

Есть ли простой способ разрешить сокращения? Например, вот потенциальная сокращенная версия приведенной выше строки.

./my_program.py dpd -r -t 80

В идеале я хотел бы иметь возможность использовать обе формы командной строки - длинную, информативную версию, а также короткую, простую для ввода версию. Есть ли хороший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 08 марта 2013

Хотя ответ argparse был принят, первоначальный вопрос заключался в том, как этого добиться с помощью более простого модуля argh.Вот как:

from argh import *
from show import show # only needed for demonstration purposes

CMD_ALIASES = { 'dpd' : 'download-and-parse-data',
                'dp'  : 'download-and-parse-data',
                'dd'  : 'download-data',
                'pd'  : 'parse-data', }

def choices_for(d):
    """
    Return list of unique items (command aliases plus unabridged commands).
    Works in Python >= 2.5. NB In the degenerate case when an alias and an
    unabridged command are identical, the alias takes priority. (In my best
    Terminator voice: Don't do dat.)
    """
    return sorted(set(d.keys()) | set(d.values()))

@arg('cmd', choices=choices_for(CMD_ALIASES))
@arg('-r', '--randomize-order', default=False)
@arg('-t', '--training-percent', default=0)
def main(args):
    args.command = CMD_ALIASES.get(args.cmd, args.cmd)
    show(args, props=True)

dispatch_command(main)

Это устанавливает слегка обобщенный механизм псевдонимов (тот, который позволяет использовать несколько псевдонимов для любой данной команды).Результирующий объект args имеет как значение args.cmd для фактически заданной команды, так и каноническое значение args.command, которое разрешает указанный псевдоним, если таковой имеется.

Например:

$ ./my_program.py dpd -r -t 80
args:
    cmd='dpd'
    command='download-and-parse-data'
    randomize_order=True
    training_percent=80

Существует также еще один механизм, встроенный в argh для создания псевдонимов команд при отправке команд отдельным функциям: декоратор @aliases, описанный здесь .Обратите внимание, что этот подход зависит от последних версий argparse, поэтому может не работать в более старых дистрибутивах / средах Python.

0 голосов
/ 08 марта 2012

Вы можете сделать это довольно легко с помощью метода argparse add_subparsers(). Смотри документы здесь .

В вашем случае это может привести к следующему:

parser = argparse.ArgumentParser()
subs = parser.add_subparsers()
dpd = subs.add_parser('download-and-parse-data', aliases=['dpd'])
dpd.add_argument(...)
...

EDIT

В каждом вызове add_argument() вы также можете использовать несколько имен аргументов. Смотри документы здесь . Например:

parser.add_argument('-f', '--foo')
...