10

如何在使用该cmd模块实现的面向行的命令解释器中为命令创建别名?

要创建命令,我必须实现该do_cmd方法。但是我有长名称的命令(如constraint),我想为这些命令(如)提供别名(实际上是快捷方式co)。我怎样才能做到这一点?

我想到的一种可能性是实现do_alias(like ) 方法并在此方法中do_co调用do_cmd( )。do_constraint但这在 CLI 的帮助下为我带来了新的命令。

有没有其他方法可以实现这一目标?或者有没有办法从help输出中隐藏命令?

4

3 回答 3

9

您可以覆盖该default方法并搜索合适的命令处理程序(正如Brian已经建议的那样):

import cmd

class WithAliasCmd(cmd.Cmd):

    def default(self, line):
        cmd, arg, line = self.parseline(line)
        func = [getattr(self, n) for n in self.get_names() if n.startswith('do_' + cmd)]
        if func: # maybe check if exactly one or more elements, and tell the user
            func[0](arg)
于 2012-10-16T09:55:17.743 回答
9

以下解决方案使别名命令共享单个帮助消息。它使您可以将所有别名保存在一个易于编辑的位置,同时使文档变得更加容易。它根据具有函数值的别名字典检查用户输入,并覆盖default()参见树懒布莱恩)和do_help()方法。

在这里,我创建了别名'c''con'执行do_constraint()'q'调用do_quit()'h'调用do_help()'h q'此解决方案的好处是'help quit'打印相同的消息。可以在单个文档字符串中维护多个别名命令的文档。

import cmd

class prompt(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.aliases = { 'c'   : self.do_constraint ,
                         'con' : self.do_constraint ,
                         'q'   : self.do_quit       ,
                         'h'   : self.do_help       }

    def do_constraint(self, arg):
        '''Constrain things.'''
        print('Constraint complete.')

    def do_quit(self, arg):
        '''Exit the program.'''
        return True

    def do_help(self, arg):
        '''List available commands.'''
        if arg in self.aliases:
            arg = self.aliases[arg].__name__[3:]
        cmd.Cmd.do_help(self, arg)

    def default(self, line):
        cmd, arg, line = self.parseline(line)
        if cmd in self.aliases:
            self.aliases[cmd](arg)
        else:
            print("*** Unknown syntax: %s" % line)
于 2016-09-15T21:17:30.763 回答
1

文档提到了一个默认方法,您可以覆盖它来处理任何未知命令。将其编码为前缀扫描命令列表并按照您对 do_alias 的建议调用它们。

于 2012-10-16T09:45:50.530 回答