[Python-Dev] New Module: CommandLoop

Raymond Hettinger python at rcn.com
Mon Feb 20 00:14:35 CET 2006


[Crutcher Dunnavant]
> Anyway, I'm looking for feedback, feature requests before starting the
> submission process.

With respect to the API, the examples tend to be visually dominated dominated by 
the series of decorators.  The three decorators do nothing more than add a 
function attribute, so they are essentially doing the same type of action. 
Consider combining those into a single decorator and using keywords for the 
various arguments.  For example, change:

        @cmdloop.aliases('goodbye')
        @cmdloop.shorthelp('say goodbye')
        @cmdloop.usage('goodbye TARGET')

to just:

        @cmdloop.addspec(aliases=['goodbye'], shorthelp ='say goodbye', 
usage='goodbye TARGET')

leaving the possibility of multiple decorators when one line gets to long:

        @cmdloop.addspec(aliases=['goodbye'], shorthelp ='say goodbye')
        @cmdloop.addspec(usage='goodbye TARGET  # where TARGET is a filename in 
the current directory')

Another thought on the API is to consider adding another decorator option to 
make commands case-insensitive so that 'help', 'HELP', and 'Help' will all work:
         @cmdloop.addspec(case_sensitive=True)

Also, in the absence of readline(), consider adding support for "!" style 
repeats of previous commands.

The exception hierarchy looks to be well-designed.  I'm not clear on whether it 
is internal or part of the API.  If the latter, is there an example of how to 
trap and handle specific exceptions in specific contexts?


If you're interested, here are a few code comments based on my first 
read-through:

1) The "chars" variable can be eliminated and the "while chars" and 
"c=chars.pop(0)" sequence simplified to just:
    for c in reversed(str):
        . . .

2) Can the reformatDocString() function be replaced by textwrap.dedent() or do 
they do something different?

3) In _mapCommands(), the sort can be simplified from:
        self._cmds.sort(lambda a, b: cmp(a.aliases[0], b.aliases[0]))
    to:
        self._cmds.sort(key=operator.itemgetter(0))
    or if you want to avoid module dependencies:
        self._cmds.sort(key=lambda a: a[0])

4) In _preCommand, the sort simplifies from:
                    names = self.aliasdict.keys()
                    names.sort()
                    for name in names:
    to:
                    for name in sorted(self.aliasdict):


Raymond 


More information about the Python-Dev mailing list