【发布时间】:2017-07-03 09:53:49
【问题描述】:
想象以下非常常见的情况:您编写了一个又长又复杂的函数,并意识到应该将一些代码提取到一个单独的函数中以便重用和/或可读性。通常,这个额外的函数调用不会改变程序的语义。
但是,现在假设您的函数是一个协程,并且您要提取的代码至少包含一个异步调用。现在将它提取到一个单独的函数中会突然改变程序的语义,方法是插入一个新点,协程在该点上产生,事件循环控制,并且可以在其间安排任何其他协程。
之前的例子:
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() 之间不会被挂起。重构之后,这个保证就失去了。
我的问题是:是否可以调用extracted_func() 使其立即执行,就好像它的代码是内联的?或者有没有其他方法可以在不改变程序语义的情况下执行这些常见的重构任务?
【问题讨论】: