Python 使用argh设置缩写的简单方法

Python 使用argh设置缩写的简单方法,python,command-line-arguments,argparse,optparse,argh,Python,Command Line Arguments,Argparse,Optparse,Argh,我正在使用argh库创建一个python命令行工具。我使用的几个名字都很长,例如: ./my_program.py download-and-parse-data --randomize-order --training-percent 80 是否有一种简单的方法允许使用缩写?例如,下面是上述行的一个可能的缩写版本 ./my_program.py dpd -r -t 80 理想情况下,我希望能够使用两种命令行形式——长的、信息丰富的版本,以及短的、易于键入的版本。有什么好方法可以做到这一点吗

我正在使用argh库创建一个python命令行工具。我使用的几个名字都很长,例如:

./my_program.py download-and-parse-data --randomize-order --training-percent 80
是否有一种简单的方法允许使用缩写?例如,下面是上述行的一个可能的缩写版本

./my_program.py dpd -r -t 80

理想情况下,我希望能够使用两种命令行形式——长的、信息丰富的版本,以及短的、易于键入的版本。有什么好方法可以做到这一点吗?

使用
argparse
add_subparsers()
方法可以很容易地做到这一点。见文件

在您的情况下,它可能会分解为:

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

在每个
add_argument()
调用中,您还可以使用多个参数名。见文件。例如:


使用
argparse
add_subparsers()
方法,您可以非常轻松地完成此任务。见文件

在您的情况下,它可能会分解为:

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

在每个
add_argument()
调用中,您还可以使用多个参数名。见文件。例如:


虽然
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发行版/环境中工作。

虽然接受了
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发行版/环境中工作