重构遗留的同步Python代码

时间:2013-10-31 14:09:09

标签: python asynchronous refactoring

我正在尝试重构一些类似于以下内容的Python代码: -

1) if condition1:
2)      lookupID = showSomeModalForm()
3)      result = dbLookUp(lookUpID)
     if result == 3:
        doSomething(result)
        value = showSomeModalForm2()
elif condition2:
     id = showSomeModalForm()
     doSomethingInDB(id)
     id = 0

目前,正如您所看到的,有几个地方显示了一个模态形式 - 只要模态形式返回相关if(嵌套if)下面的代码就会被执行。因此,例如,一旦第2行返回第3行,将执行

我参与了一些工作,这意味着在某些情况下代码将是同步的并且像现在一样显示为模态形式,但在其他情况下它将是异步调用。

首先,我已经将所有对showModalForm *的调用替换为指向一个名为askForInput的回调函数,如下所示。 askForInput将在同步和异步情况下实现。

def refactor(self):
   4)  if condition1:
   5)     lookupID = askForInput()
   6)     result = dbLookUp(lookUpID)
   7)     if result == 3:
   8)        doSomething(result)
   9)        value = askForInput()
  10)        value += 2
   10)  elif condition2:
  11)     id = askForInput()
  12)     doSomethingInDB(id)
   13)    id = 0

如果代码是同步的,这样可以正常工作,因为代码将执行第1行)假设condition1为true它将执行第2行)并且一旦选择了某些内容它将执行第3行)

由于这是遗留代码,这组if(嵌套ifs)编码了许多需要保留的逻辑,如果对askForInput的调用是异步的,我不确定如何重构它。因此,例如,如果在第5行进行了异步调用,我希望它返回到重构方法并在第6行继续执行。如果异步调用在第9行,我希望代码在第10行恢复,而11)将转到12)。

最初,我认为我可以使用回调并将重构方法作为参数发送 - 但是这会在顶部开始执行,我想要做的几乎是暂停保持重构方法的状态调用askForInput方法并将控制返回到正好调用askForInput的重构方法。

阅读我开始认为这可能与生成器和协同例程有关,但我不确定我是否在咆哮错误的树。

任何关于如何重构这一点的帮助都会非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以使用线程 - 例如:

import threading, time

def askForInput(arg):
    arg.append("some ID")
    time.sleep(2)

def main():
    print("starting time: {}".format(time.asctime()))
    my_input = []  # want an argument we can mutate
    thr = threading.Thread(target=askForInput, args=(my_input,))
    thr.start()
    thr.join()  # will wait here
    lookupID = my_input[0]
    print("ending time: {}".format(time.asctime()))
    print("Result back from async call: {}".format(lookupID))

if __name__ == '__main__':  
    main()

结果:

starting time: Thu Oct 31 10:32:51 2013
ending time: Thu Oct 31 10:32:53 2013
Result back from async call: some ID