2016-03-04 153 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