2016-07-28 39 views
-1

通常情況下,巨蟒由如何在Python中編寫一個小標記器?

func(arg0, arg1) 

調用的函數,但我想改變

func arg0 arg1 

例如,

#Something... 
cmd = input() 
interpret(cmd) 
#Something... 

如果我輸入'func arg0 arg1',那麼我期待的Python執行func(arg0, arg1)

參數將包含字符串,以便我們不能簡單地拆分單詞。

其實,我想寫一些腳本在我的手機上使用。所以輸入圓括號會有些惱人。

+3

所以你想重寫Python解析器來創建你自己的語言......?我認爲這裏有點超出範圍。 – deceze

+0

@deceze號碼因爲我想在手機上的終端上使用它。在我的手機上輸入括號很煩人。 –

+0

所以你只是想從輸入中分出第一個單詞,用這個名字查找函數,然後用其他參數調用它,比如'f(* args)'...? – deceze

回答

0

如果沒有args來包含空格,你可以做

fn_args=cmd.split() 
python_code="%s(%s)" % (fn[0], ", ".join(fn_args[1:])) 
eval(python_code) 

編輯:

如果它不是那麼簡單的,你應該看看https://docs.python.org/3/library/cmd.htmlhttps://docs.python.org/3/library/argparse.html但這些都需要做一些準備工作,然後才能執行任意代碼

EDIT2:

如果你不需要你的參數傳遞給確切的蟒蛇,你可以解析它們作爲JSON with the standard library

,你可以不喜歡它

import json 
cmd='fname "a" "b" 1' 
fn,sep,args=cmd.strip().partition(" ") 
end=0 
largs=[] 
d=json.JSONDecoder() 
while end < len(args): 
    args=args[end:].strip() 
    arg,end=d.raw_decode(args) 
    largs.append(arg) 
exec(fn)(*largs) # better look into exec docs 
+0

其實會有空格和逗號。 –

+0

@ZhipengYANG新增非簡單案例的鏈接 – janbrohl

+0

@ZhipengYANG新增JSON hack – janbrohl

0

你可以這樣做:

class tryClass: 
    def callFunction(self, arg, arg2): 
     print("In call") 
     print(arg) 
     print(arg2) 

input = str(input()) 
input = input.split(" ") 
funcName = input[0] 
my_cls = tryClass() 

method = getattr(my_cls, funcName) 
method(input[1], input[2]) 

如果我把輸入callFunction的Hello World工程:)

0

我只想要一個簡單的標記器。我想通過調用eval()來運行函數。這就是我爲我的項目所做的。

這裏的結果:

>>> tokenizer('func 123 abc') 
[('func', 'func'), ('arg', '123'), ('arg', 'abc')] 
>>> tokenizer('func 123.5 abc') 
[('func', 'func'), ('arg', '123.5'), ('arg', 'abc')] 
>>> tokenizer('func 123.5 abc "Hello, World!"') 
[('func', 'func'), ('arg', '123.5'), ('arg', 'abc'), ('arg', 'Hello, World!')] 
>>> tokenizer("func 123.5 abc 'Hello, World!'") 
[('func', 'func'), ('arg', '123.5'), ('arg', 'abc'), ('arg', 'Hello, World!')] 

Attentsion:這可能並不適合所有人,這是不是一個完整的解析器或分詞器。

代碼:

def isNumber(cmd): 
    try: 
     int(cmd) 
     return True 
    except ValueError: 
     try: 
      float(cmd) 
      return True 
     except ValueError: 
      return False 
    return False 

def isWord(cmd): 
    if len(cmd) == 0: 
     return False 
    if cmd[0].isalpha(): 
     for i in cmd[1:]: 
      if not i.isalpha() and i != '_' and i != '-': 
       return False 
     return True 
    return False 
def spaceParser(cmd): 
    i = 0 
    for i in range(len(cmd)): 
     if cmd[i] == ' ': 
      continue 
     break 
    return cmd[i:] 

def funcNameParser(cmd): 
    cmd = spaceParser(cmd) 
    i = 0 
    word = '' 
    for i in range(len(cmd)): 
     if cmd[i] != ' ': 
      word += cmd[i] 
     else: 
      break 
    if i + 1 > len(word): 
     return (word, cmd[i:]) 
    return (word, cmd[i+1:]) 

def argumentParser(cmd): 
    cmd = spaceParser(cmd) 
    if cmd[0] == '\'': 
     word = '' 
     i = 0 
     for i in range(1, len(cmd)): 
      if cmd[i] != '\'': 
       word += cmd[i] 
      else: 
       return (word, cmd[i+1:]) 
     assert False, 'Fatal exception: String not finished.' 
    if cmd[0] == '"': 
     word = '' 
     i = 0 
     for i in range(1, len(cmd)): 
      if cmd[i] != '"': 
       word += cmd[i] 
      else: 
       return (word, cmd[i+1:]) 
     assert False, 'Fatal exception: String not finished.'    
    i = 0 
    word = '' 
    for i in range(len(cmd)): 
     if cmd[i] != ' ': 
      word += cmd[i] 
     else: 
      break 
    assert isWord(word) or isNumber(word), 'Fatal exception: Not a valid name.' 
    if i + 1 > len(word): 
     return (word, cmd[i:]) 
    return (word, cmd[i+1:]) 

def tokenizer(cmd): 
    token = [] 
    result = funcNameParser(cmd) 
    token += [('func', result[0])] 
    while len(result[1]) != 0: 
     result = argumentParser(result[1]) 
     token += [('arg', result[0])] 
    return token 
0

的內置shlex模塊可能是你想要什麼:

>>> import shlex 
>>> cmd = "func arg0 arg1 'arg2 has spaces'" 
>>> list(shlex.shlex(cmd)) 
['func', 'arg0', 'arg1', "'arg2 has spaces'"] 

如果你可以信任的輸入,然後實際調用這個看起來像:

>>> tokens = list(shlex.shlex(cmd)) 
>>> # here is a stupid func function that reverses its input args 
>>> func = lambda *args: print(*reversed(args)) 
>>> eval(tokens[0])(*tokens[1:]) 
'arg2 has spaces' arg1 arg0