Python cmd模块中的标签自动补全和子命令简单实现?
在Python的Cmd类中,能不能给子命令添加Tab键自动补全功能呢?比如说,我在运行我的命令循环时,想要有一个叫做add
的命令,然后可以选择动物名字,比如add horse
或者add elephant
。如果可能的话,我该怎么为这些子命令实现Tab键自动补全呢?
我在实际项目中做的一件事是为不同的模式使用不同的类。如果你输入whitelist
,它会在那个类中运行另一个命令循环,这时就进入了“whitelist”模式。你可以输入exit来返回主命令循环。这样做对于一些复杂的模式来说似乎不错,但为了像上面那样简单地添加不同类型的东西,创建一个继承Cmd
的新类似乎有点过于复杂。那么,有什么更简单的方法可以为Cmd
类添加可以自动补全的子命令呢?谢谢。
1 个回答
4
下面的代码可以正常运行:
#!/usr/bin/env python
from __future__ import print_function
from cmd import Cmd
import readline # noqa
class Zoo(Cmd):
def __init__(self, animals):
Cmd.__init__(self)
self.animals = animals
def do_add(self, animal):
print("Animal {0:s} added".format(animal))
def completedefault(self, text, line, begidx, endidx):
tokens = line.split()
if tokens[0].strip() == "add":
return self.animal_matches(text)
return []
def animal_matches(self, text):
matches = []
n = len(text)
for word in self.animals:
if word[:n] == text:
matches.append(word)
return matches
animals = ["Bear", "Cat", "Cheetah", "Lion", "Zebra"]
zoo = Zoo(animals)
zoo.cmdloop()