——根据福坦的回答编辑———
从这里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
在程序的顶部,而不是在函数内部使用它之前?你知道吗
有时不在模块级导入
twisted.internet.reactor
的原因是,在导入时,如果尚未显式选择特定的reactor实现,将进行默认选择。一旦选择了实现,就不能更改它。你知道吗如果模块在顶层导入
twisted.internet.reactor
,那么一旦导入,反应器就被导入。这使得选择一个不同的reactor实现变得有些困难,因为您必须在导入任何在顶层导入twisted.internet.reactor
的模块之前这样做。你知道吗因此,一种约定是只在需要使用它的函数中导入
twisted.internet.reactor
。这意味着在调用函数之前,导入不会发生,而调用函数的时间通常足够晚,以至于已经选择了实现。你知道吗另一个约定(包括我在内的一些人更喜欢)是定义接受reactor作为参数的api。通过这种方式,您根本不需要导入reactor,它将与函数所需的任何其他输入一起传递给您。你知道吗
这种方法的一大优点是它使代码更容易进行单元测试。你知道吗
如果仔细观察,
poetry_main
函数中还有另一个from twisted.internet import reactor
。导入的范围是词法的,比如变量和函数。你知道吗关于这样做的原因,我可以考虑不污染模块的全局名称空间。你知道吗
Python保留了一个导入模块的内部字典,因此不管一个模块被
import
加载多少次,它只会被加载一次,并且它的内部状态将在所有引用中共享。你知道吗这对于允许循环模块依赖非常重要,否则将以无限递归结束。你知道吗
相关问题 更多 >
编程相关推荐