Простой способ настроить сокращения с Argh
Я использую библиотеку argh для создания инструмента командной строки python. Некоторые из названий, которые я использую, оказались довольно длинными, например:
./my_program.py download-and-parse-data --randomize-order --training-percent 80
Есть ли простой способ разрешить сокращения? Например, вот потенциальная сокращенная версия приведенной выше строки.
./my_program.py dpd -r -t 80
В идеале я хотел бы иметь возможность использовать обе формы командной строки - длинную информативную версию, а также короткую, простую для ввода версию. Есть ли хороший способ сделать это?
2 ответа
Вы можете сделать это довольно легко с argparse
"s add_subparsers()
метод. Смотрите документы здесь.
В вашем случае это может привести к следующему:
parser = argparse.ArgumentParser()
subs = parser.add_subparsers()
dpd = subs.add_parser('download-and-parse-data', aliases=['dpd'])
dpd.add_argument(...)
...
РЕДАКТИРОВАТЬ
В каждом add_argument()
Вы также можете использовать несколько имен аргументов. Смотрите документы здесь. Например:
parser.add_argument('-f', '--foo')
В то время как 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
декоратор, описанный здесь. NB этот подход зависит от последних версий argparse
, поэтому может не работать в старых дистрибутивах / средах Python.