2016-03-04 151 views
0

我有一個程序,用戶應該能夠從下拉列表中選擇並選擇命令。在這個列表中,還有一個重複命令,它基本上做了for循環,因此repeatend repeat之間的所有命令都應循環所述的次數。見圖片:調用函數的Python重複函數

enter image description here

現在,我還不知道如何編程處理重複功能。我知道python處理類像對象,所以也許這可以幫助,但我有點失落。

此刻,我向處理命令執行的線程發送一個字符串列表,然後解析並執行每個命令。

def command(self, item): 
    if item.startswith('Pan'): 
     ... do stuff 
    elif item.startswith('...'): 
     ... do something else 

我怎麼會重寫這個讓repeat是一個可調用的函數/方法?

+0

當用戶點擊「重複:150」,你將不得不解析後續行,直到「結束重複」,並在一個步驟給其他線程發送的所有信息。我不知道另一個線程會知道什麼命令要重複。我不明白「重寫」command命令會如何讓你到達那裏。 –

回答

1

創建一個函數multi_command,它接受多個命令並按順序執行它們。 當此功能遇到「重複」時,直到獲得相應的「結束重複」爲止,創建一個所有以下命令的列表。這個新列表是您的總列表的一個子集。用此列表呼叫multi_command,然後跳到「結束重複」之後的命令。

僞代碼:

def multi_commands(items): 
    highest_idx_already_done = 0 
    for idx, item in enumerate(items): 
     if highest_idx_already_done > idx: 
      continue 
     if item == "repeat": 
      num_repeats = ... 
      sub_items = [] 
      for sub_item in items[idx+1:]: 
       if sub_item == "end repeat": 
        break 
       sub_items.append(sub_item[5:]) # Skip indentation 
      highest_idx_already_done = idx + len(sub_items) 
      for _ in range(num_repeats): 
       multi_commands(sub_items) 
     else: 
      command(item) 
+0

會試試這個。這是否處理嵌套的多重命令? – enrm

+0

這種方法的問題在於它讀取最近的'end repeat'標籤,它不一定映射到正確的'start repeat' ..也許縮進應該用於映射? – enrm

+0

它應該適用於嵌套命令,是的。它也依靠縮進來找到「結束重複」標記。如果你不想這樣做,你將不得不在「for sub_item」循環中保留「重複」和「end_repeats」的數量。 – acdr