Python cmd模块多级选项卡完成(来自两个或多个列表)

2024-10-02 10:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前的CLI版本(本例中已清理)在两个级别的tab补全中运行得非常好。我已经没有办法从第二个列表中选择如何添加竞争了。你知道吗

这是我目前的版本:

from cmd import Cmd

settings = ['first','second','third']
parameters = ['alpha', 'bravo', 'charlie']

class Prompt(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = 'Command: '
        self.setting1 = ""
        self.setting2 = ""
        self.setting3 = ""

    def completenames(self, text, *ignored):
        # Modified tab complete to add extra space after command
        dotext = 'do_'+text
        return [a[3:]+' ' for a in self.get_names() if a.startswith(dotext)]

    def do_set(self, args):
        params = args.split()
        if len(params) == 0:
            print('Setting 1 = ' + self.setting1)
            print('Setting 2 = ' + self.setting2)
            print('Setting 3 = ' + self.setting3)
        else:
            if params[0] in settings and len(params) > 1:
                if params[0] == settings[0]:
                    self.setting1 = params[1]
                    print('Setting 1 = ' + self.setting1)
                elif params[0] == settings[1]:
                    self.setting2 = params[1]
                    print('Setting 2 = ' + self.setting2)
                elif params[0] == settings[2]:
                    self.setting3 = params[1]
                    print('Setting 3 = ' + self.setting3)
            else:
                print('Usage:')
                print('set <setting> <value>')
                print('type "set" for possible settings and their current value')

    def complete_set(self, text, line, start_index, end_index):
        if text:
            return [
                command + ' ' for command in settings
                if command.startswith(text)
            ]
        else:
            return settings

    def do_EOF(self, inp):
        print('\n')
        return True

Prompt().cmdloop()

有了两个级别,就可以正常工作了:

Command: <tab>s<tab> fi<tab>

结果是:set first

我想要的是从这个参数列表中完成第三个选项选项卡。所以看起来是这样的:

Command: <tab>s<tab> fi<tab> br<tab>

结果自然是:set first bravo


Tags: textselfreturnifsettingsdefparamssetting

热门问题