2016-06-07 198 views
0

我目前正在研究一個小的命令行程序,它解析來自網站的電視節目,用戶可以調用它的不同功能。我已存儲在字典中,看起來像這樣的功能:python:從命令行輸入函數

commands = {"show": show, "show x": showX, "help": TVhelp, "exit": TVexit, 
       "actor list": actorList, "actor add x": actorAdd, 
       "actor delete x": actorDel, "recommend": recommend} 

時存儲作爲該鍵的值的用戶類型任何鍵,則該函數被調用。例如顯示只顯示所有程序的列表,幫助和退出應該是自我解釋的。

從命令行使用裸函數名稱調用這些函數時沒有任何問題,但問題是某些函數需要額外的參數(我在此稱其爲x)。

當用戶例如寫入「節目20」時,應該顯示具有索引20的節目列表中的節目。或者當輸入是「演員添加阿諾德施瓦辛格」時,該名字應該添加到列表中。

我想要的是,該函數可以從命令行調用一個額外的參數,程序識別輸入中的函數名稱並將數字或演員名稱作爲參數。

有沒有用字典做這件事的pythonic方法?

歡呼

+0

你只需要做出結構的一些決定,然後執行它們,就像「沒有功能鍵可以有空格」等應有盡有第一空間可以治療後作爲參數列表,例如。 –

+2

不確定你在問什麼。你爲什麼不能在調用函數時通過參數? –

+0

您可以拆分輸入文本並檢查第一個或兩個元素,然後將其餘元素作爲參數傳遞給哈希函數 –

回答

1

首先,我建議你使用argparse這一點。該API複雜但有效。

如果你真的想推出你自己的參數解析,只需將任何附加參數傳遞給字典中指定的函數。

def zoo_desc(args): 
    y = int(args[2]) 
    describe_me = zoo[y] 
    print ('{}, {}'.format(describe_me[0], describe_me[1])) 

def zoo_list(args): 
    for index, entry in enumerate(zoo): 
     print ('{}: {}'.format(index, entry[0])) 

handlers = { 
     'zoo list': zoo_list, # List the animals in the zoo. 
     'zoo desc': zoo_desc # Describe the indexed animal, aka 'zoo desc x' 
     } 

zoo = [ 
('cat', 'a cute feline'), 
('mouse', 'a cute rodent'), 
('rat', 'an uncute rodent') 
] 

x = input() 
while (x): 
    for a in handlers: 
     if x.startswith(a): 
      handlers[a](x.split()) # When we call a handler, we also pass it the arguments 

    x = input() 

輸出:

zoo list 
0: cat 
1: mouse 
2: rat 
zoo desc 1 
mouse, a cute rodent