2012-04-19 64 views
3

我正在使用cmd模塊的一個快速python腳本,它允許用戶輸入文本命令,然後輸入基本url查詢字符串格式的參數。該提示將東西來回答類似Python的cmd模塊 - 解析線的值

commandname foo=bar&baz=brack

使用CMD,我似乎無法找到重寫影響的說法line被傳遞給所有的do_*方法的方法哪一種方法。我想對這些值運行urlparse.parse_qs,並在每個do_*方法中調用此行看起來很笨拙。

precmd方法得到整條線,在commandname被拆分和解釋之前,所以這不適用於我的目的。我也不是很熟悉如何在類中放置一個裝飾器,並且無法在不破壞範圍的情況下將其修改。

基本上,cmd Python文檔說以下

反覆發出提示,接受輸入,解析初始前綴關閉 接收到的輸入,並派遣行動方法,通過他們的 剩餘的該線作爲參數。

我想打,將做額外處理以生成字典關閉的構件用作line參數,而不是在每一個功能將它們解釋和手認爲「行的其餘部分」的方法。

謝謝!

回答

3

您可能會覆蓋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) foo 
{} 
(Cmd) foo a b c 
{} 
(Cmd) foo a=b&c=d 
{'a': ['b'], 'c': ['d']} 

這是你要實現的目標是什麼?

這是一個使用類裝飾修改 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() 

我很快就拼湊了一起,它似乎按預期工作,但是,我對 有任何問題的建議,或者如何改進此解決方案。