Python cmd模块-解析第行中的值

Python cmd模块-解析第行中的值,python,cmd,command-line-interface,Python,Cmd,Command Line Interface,我正在使用cmd模块编写一个快速python脚本,它允许用户输入文本命令,后跟基本url查询字符串格式的参数。这些提示将得到如下回答 commandname foo=bar&baz=brack 使用cmd,我似乎找不到要重写哪个方法来影响参数行传递给所有do.*方法的方式。我想对这些值运行urlparse.parse\u qs,在每个do.*方法中调用它似乎很笨拙 precmd方法在分解和解释commandname之前获取整行,因此这不适用于我的目的。我也不太熟悉如何在这样的类中放置装饰器,因此

我正在使用
cmd
模块编写一个快速python脚本,它允许用户输入文本命令,后跟基本url查询字符串格式的参数。这些提示将得到如下回答

commandname foo=bar&baz=brack

使用cmd,我似乎找不到要重写哪个方法来影响参数
传递给所有
do.*
方法的方式。我想对这些值运行
urlparse.parse\u qs
,在每个
do.*
方法中调用它似乎很笨拙

precmd
方法在分解和解释
commandname
之前获取整行,因此这不适用于我的目的。我也不太熟悉如何在这样的类中放置装饰器,因此无法在不破坏范围的情况下完成它

基本上,python文档的作用如下

反复发出提示、接受输入、解析初始前缀 接收到的输入,并分派给操作方法,将 行的其余部分作为参数

我想创建一个方法,对“行的剩余部分”进行额外处理,并将生成的字典作为
参数传递给成员函数,而不是在每个函数中解释它们

import cmd
import urlparse

class myCmd(cmd.Cmd):
    def onecmd(self, line):
        """Mostly ripped from Python's cmd.py"""
        cmd, arg, line = self.parseline(line)
        arg = urlparse.parse_qs(arg) # <- added line
        if not line:
            return self.emptyline()
        if cmd is None:
            return self.default(line)
        self.lastcmd = line
        if cmd == '':
            return self.default(line)
        else:
            try:
                func = getattr(self, 'do_' + cmd)
            except AttributeError:
                return self.default(line)
            return func(arg)

    def do_foo(self, arg)
        print arg

my_cmd = myCmd()
my_cmd.cmdloop()

谢谢

您可能会重写
onecmd()
方法,如下快速示例所示。
onecmd()
方法基本上是原始
cmd.py
的一个副本,但在将参数传递给函数之前添加了对
urlparse.parse_qs()
的调用

import cmd
import urlparse

class myCmd(cmd.Cmd):
    def onecmd(self, line):
        """Mostly ripped from Python's cmd.py"""
        cmd, arg, line = self.parseline(line)
        arg = urlparse.parse_qs(arg) # <- added line
        if not line:
            return self.emptyline()
        if cmd is None:
            return self.default(line)
        self.lastcmd = line
        if cmd == '':
            return self.default(line)
        else:
            try:
                func = getattr(self, 'do_' + cmd)
            except AttributeError:
                return self.default(line)
            return func(arg)

    def do_foo(self, arg)
        print arg

my_cmd = myCmd()
my_cmd.cmdloop()
这就是你想要达到的目标吗

下面是另一个可能的解决方案,它使用类装饰器来修改
cmd.cmd
子类,基本上对所有
do.
该类方法:

import cmd
import urlparse
import types

# function decorator to add parse_qs to individual functions
def parse_qs_f(f):
    def f2(self, arg):
        return f(self, urlparse.parse_qs(arg))
    return f2

# class decorator to iterate over all attributes of a class and apply
# the parse_qs_f decorator to all do_* methods
def parse_qs(cls):
    for attr_name in dir(cls):
        attr = getattr(cls, attr_name)
        if attr_name.startswith('do_') and type(attr) == types.MethodType:
            setattr(cls, attr_name, parse_qs_f(attr))
    return cls

@parse_qs
class myCmd(cmd.Cmd):
    def do_foo(self, args):
        print args

my_cmd = myCmd()
my_cmd.cmdloop()
我很快把它拼凑起来,它看起来像预期的那样工作,但是,我很抱歉 欢迎对任何缺陷或如何改进此解决方案提出建议