想象一下以下非常常见的情况:您已经编写了一个长而复杂的函数,并且意识到一些代码应该被提取到一个单独的函数中,以便重用和/或可读性.通常,这个额外的函数调用不会改变程序的语义.
然而,现在假设您的函数是一个协程,并且您想要提取的代码至少包含一个异步调用.现在,通过插入一个新的点,将其提取到一个单独的函数中,突然改变了程序的语义.在这个点上,协程产生,事件循环获得控制,任何其他协程都可以在其间进行调度.
之前的例子:
async def complicated_func():
foo()
bar()
await baz()
例如:
async def complicated_func():
foo()
await extracted_func()
async def extracted_func():
bar()
await baz()
在前面的示例中,保证complicated_func
不会在呼叫foo()
和呼叫bar()
之间被挂起.重构后,这种保证就失go 了.
我的问题是:是否可以调用extracted_func()
,使其立即执行,就好像其代码是内联的?或者有没有其他方法可以在不改变程序语义的情况下执行这种常见的重构任务?