导入内容的对象范围是如何工作的?

2024-04-23 21:52:27 发布

您现在位置:Python中文网/ 问答频道 /正文

——根据福坦的回答编辑———

从这里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

在程序的顶部,而不是在函数内部使用它之前?你知道吗


Tags: fromhttpsimportgithub编辑getpoetrylen
2条回答

有时不在模块级导入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加载多少次,它只会被加载一次,并且它的内部状态将在所有引用中共享。你知道吗

这对于允许循环模块依赖非常重要,否则将以无限递归结束。你知道吗

相关问题 更多 >