Использование модуля cmd: как документировать подкоманды в `help` и интегрировать с автозаполнением? - PullRequest
0 голосов
/ 01 июля 2019

Я использую модуль cmd и имею команду server (метод do_server()), которая имеет автозаполнение из коробки (я на macOS).Это все нормально и работает как ожидалось.Но если я хочу дополнительно использовать подкоманду в команде server, то все получается не так, как мне нужно.

Мне понадобится следующее:
- подкоманды должнытакже может быть интегрирован с командой help (не должен отображаться при вводе help, поскольку они не являются командами первого уровня, но должен отображаться при вводе help server)
- подкоманды также должны интегрироваться с автоматическимизавершено

В настоящее время я не вижу способа определить подкоманды из коробки.Мне нужно реализовать их в качестве аргументов для команды, которая не является идеальной.

Мой вопрос будет таким: как мне добиться автоматического документирования подкоманд с помощью help и иметь автозаполнение, чтобы оно интегрировалось каккак можно лучше с cmd?

В этом примере я хотел бы лучше интегрировать connect в качестве подкоманды:

from cmd import Cmd


class Tansanit(Cmd):

    def do_server(self, args):
        """ Show server info """
        print("Some server details")

        if args and args == "connect":
            print("Connect to the server")

    def do_quit(self, args):
        """ Quit CLI """
        raise SystemExit


if __name__ == '__main__':
    t = Tansanit()
    t.prompt = "> "
    t.cmdloop()

Я бы предпочел иметь что-то вродеэто:

from cmd import Cmd


class Tansanit(Cmd):

    def do_server(self, args):
        """ Show server info """
        print("Some server details")

    def do_server_connect(self, args):
        """ Connect to server """
        print("Connect to the server")

    def do_quit(self, args):
        """ Quit CLI """
        raise SystemExit


if __name__ == '__main__':
    t = Tansanit()
    t.prompt = "> "
    t.cmdloop()

К сожалению, это невозможно.

1 Ответ

0 голосов
/ 10 июля 2019

Relavant infos можно найти здесь

Автозаполнение для подкоманд

Интерпретатор может обрабатывать завершение для имен команд, но для аргументов командВы должны помочь этому.Для команды xxx это делается путем определения метода complete_xxx.Например, если вы определили цветовую команду, метод завершения для этой команды может быть следующим:

_AVAILABLE_COLORS = ('blue', 'green', 'yellow', 'red', 'black')
def complete_color(self, text, line, begidx, endidx):
    return [i for i in _AVAILABLE_COLORS if i.startswith(text)]

Метод complete_xxx принимает четыре аргумента:

text isстрока, с которой мы сопоставляем, все возвращаемые совпадения должны начинаться с нее. Строка - это текущая строка ввода.список (возможно, пустой) строк, представляющих возможные дополнения.Аргументы begidx и endidx полезны, когда завершение зависит от позиции аргумента.

help для подкоманд

Вы также можете определить справку для тем, которыене относятся к командам:

def help_introduction(self):
    print 'introduction'
    print 'a good place for a tutorial'

Это не идеально, поскольку справка будет классифицирована как undocumented commands, но для аргумента.Но, может быть, еще лучше, чем ничего.

...