Python cmd模块解析lin中的值

2024-06-06 09:57:43 发布

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

我正在使用cmd模块编写一个快速python脚本,它允许用户以基本url查询字符串格式输入文本命令和参数。这些提示将用以下内容进行回答:

commandname foo=bar&baz=brack

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

在分离并解释precmd之前,precmd方法得到了整行代码,因此这对我来说行不通。我也不太熟悉如何在这样的类中放置一个装饰器,并且无法在不破坏作用域的情况下完成它。在

基本上,cmd的python文档如下所示

Repeatedly issue a prompt, accept input, parse an initial prefix off the received input, and dispatch to action methods, passing them the remainder of the line as argument.

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

谢谢!在


Tags: 模块the方法函数字符串用户脚本cmd
1条回答
网友
1楼 · 发布于 2024-06-06 09:57:43

可以重写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()

样本输出:

^{pr2}$

这就是你想要达到的目标吗?在

下面是另一个可能的解决方案,它使用类修饰符来修改 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()

我很快就把这个拼凑在一起,它看起来像我想要的那样工作,但是,我 对任何陷阱或如何改进此解决方案的建议持开放态度。在

相关问题 更多 >