Override undocumented help area in Python's cmd module

烈酒焚心 提交于 2020-02-03 09:20:48

问题


I am using Python's cmd module to build a little CLI tool. I am not a fan of showing the undocumented commands listed. So when I type 'help' I would like to just show the documented commands.

Currently typing help shows this:

Documented commands (type help <topic>):
========================================
exit  help  projects

Undocumented commands:
======================
EOF

I have that EOF bit in there because I need to exit gracefully, as is documented by the cmd examples. But I don't want it listed. If I do document it - it makes no sense. How can I override and not show 'undocumented commands'?

My code:

from cmd import Cmd
from ptcli import Ptcli
from termcolor import colored

class Pt(Cmd):

  Cmd.intro = colored("Welcome to pt CLI","yellow")
  Cmd.prompt = colored(">> ","cyan")

  def do_projects(self,line):
    'Choose current project from a list'
    pt =  Ptcli()
    result = pt.get_projects()
    for i in result:
        print i['name']

def do_exit(self,line):
    'Exit pt cli'
    return True

def do_EOF(self, line):
    return True

def default(self, arg):
    ''' Print a command not recognized error message '''

if name == 'main': Pt().cmdloop()


回答1:


You can use the hack below

In Pt class, set undoc_header to None and override print_topic method not to print section if header is None

undoc_header = None 

def print_topics(self, header, cmds, cmdlen, maxcol):                                                                                                                   
    if header is not None:                                                                                                                                              
        if cmds:                                                                                                                                                        
            self.stdout.write("%s\n"%str(header))                                                                                                                       
            if self.ruler:                                                                                                                                              
                self.stdout.write("%s\n"%str(self.ruler * len(header)))                                                                                                 
            self.columnize(cmds, maxcol-1)                                                                                                                              
            self.stdout.write("\n")    



回答2:


class Pt(Cmd):
    __hiden_methods = ('do_EOF',)

def do_EOF(self, arg):
    return True

def get_names(self):
    return [n for n in dir(self.__class__) if n not in self.__hiden_methods]

That will hide the method from the completion also.




回答3:


Improving on @user933589's answer:

A slightly better approach would be to override the print_topics method but still call the base method defined in the Cmd class, as follows:

undoc_header = None

def print_topics(self, header, cmds, cmdlen, maxcol):
    if header is not None:
        Cmd.print_topics(self, header, cmds, cmdlen, maxcol)


来源:https://stackoverflow.com/questions/23749097/override-undocumented-help-area-in-pythons-cmd-module

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!