自定义python交互式shell中的多字命令

时间:2018-01-04 17:26:16

标签: python python-cmd

我正在尝试使用cmd模块在​​Python中构建一个小型交互式shell。是否有一种简单的方法来允许多字命令?

例如,处理hello命令

很容易
class FooShell(Cmd):
    def do_hello(self, args):
        print("Hi")

但是如果我想要更复杂的东西呢?假设我正在尝试实现SQL shell并想要编写show tablesshow命令可以使用多个目标,例如show track_countsshow bonjour。如果我想在cmd模块中处理这样的事情,看起来我必须编写以下内容:

class FooShell(Cmd):
    def do_show(self, line):
        args = line.strip().split(" ")
        if args == []:
            print("Error: show command requires arguments")
        else:
            if args[0] == "tables":
                pass # logic here
            elif args[0] == "bonjour":
                pass # logic here
            elif args[0] == "track_counts":
                pass # logic here
            else:
                print("{} is not a valid target for the 'show' command".format(args[0]))
                print("Valid targets are tables, bonjour, track_counts")

这种方法存在一些问题:

  • 我必须自己编写错误消息。当我在if语句中添加其他命令时,我必须手动更新有效命令列表。
  • 用户输入show
  • 后,此处没有制表符
  • 这真的很难看。

写上述内容的另一种方式是这样的:

class FooShell(Cmd):
    def do_show_tables(self, args):
        pass

    def do_show_bonjour(self, args):
        pass

    def do_show_track_counts(self, args):
        pass

    def do_show(self, line):
        args = line.strip().split(" ")
        if args == []:
            print("Error: show command requires arguments")
        else:
            handlers = {
                "tables": self.do_show_tables,
                "bonjour": self.do_show_bonjour,
                "track_counts": self.do_show_track_counts
            }
            handler = handlers.get(args[0], None)
            if handler:
                handler(args[1:])
            else:
                print("{} is not a valid target for the 'show' command".format(args[0]))
                targets = ", ".join([key for key in handlers])
                print("Valid targets are: {}".format(targets))

但是在'show'命令之后,这仍然没有给标签完成。此外,现在感觉我基本上重写了cmd模块的核心功能。

有更简单的方法吗?我应该使用其他模块而不是cmd吗?

编辑:要清楚,我实际上并没有编写SQL shell,只是将其作为我希望如何解析多字命令的示例。

0 个答案:

没有答案