-福坦回答后编辑
从这里开始https://github.com/jdavisp3/twisted-intro/blob/master/twisted-client-3/get-poetry.py
反应堆是从
def get_poetry(host, port, callback):
...
from twisted.internet import reactor以及主要功能。
然后停了下来
def poetry_main():
...
def got_poem(poem):
poems.append(poem)
if len(poems) == len(addresses):
reactor.stop(),那么两个反应堆都指向同一个反应堆吗?同一事物的多个导入是如何工作的?
还有,为什么不直接定义
from twisted.internet import reactor在程序的顶部,而不是在使用之前的函数中?
发布于 2013-04-29 12:21:20
twisted.internet.reactor有时没有在模块级别导入的原因是,第一次导入它时,如果还没有显式选择特定的反应堆实现,就会做出默认的选择。一旦选择了实现,就无法更改它。
如果模块在顶层导入twisted.internet.reactor,那么一旦它们被导入,反应堆就会被导入。这使得选择不同的反应堆实现变得有些困难,因为在导入任何在顶层导入twisted.internet.reactor的模块之前,您必须这样做。
因此,一种约定是只导入需要使用它的函数内部的twisted.internet.reactor。这意味着在调用函数之前不会发生导入,这通常已经晚到已经选择了实现。
另一个惯例(包括我自己在内的一些人)是定义接受反应堆作为论据的API。通过这种方式,您根本不导入反应堆,它将与您所需要的任何其他输入一起传递给您。
这种方法的一个最大优点是它使代码更容易进行单元测试。
发布于 2013-04-29 09:57:48
如果仔细看,poetry_main函数中还有另一个poetry_main函数。导入的范围是词法,就像变量和函数一样。
关于这样做的原因,我可以考虑不污染模块的全局命名空间。
Python保存了一个导入模块的内部字典,因此不管一个模块被import编辑了多少次;它将只加载一次,并且它的内部状态将在所有引用之间共享。
这对于允许循环模块依赖非常重要,否则将以无限递归结束。
https://stackoverflow.com/questions/16275670
复制相似问题