Хотя ответ 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.