我正在尝试使用cmd
模块在Python中构建一个小型交互式shell。是否有一种简单的方法来允许多字命令?
例如,处理hello
命令
class FooShell(Cmd):
def do_hello(self, args):
print("Hi")
但是如果我想要更复杂的东西呢?假设我正在尝试实现SQL shell并想要编写show tables
。 show
命令可以使用多个目标,例如show track_counts
或show 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")
这种方法存在一些问题:
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,只是将其作为我希望如何解析多字命令的示例。