首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进口物品的对象范围是如何工作的?

进口物品的对象范围是如何工作的?
EN

Stack Overflow用户
提问于 2013-04-29 09:50:47
回答 2查看 58关注 0票数 2

-福坦回答后编辑

从这里开始https://github.com/jdavisp3/twisted-intro/blob/master/twisted-client-3/get-poetry.py

反应堆是从

代码语言:javascript
复制
def get_poetry(host, port, callback):
  ...
  from twisted.internet import reactor

以及主要功能。

然后停了下来

代码语言:javascript
复制
def poetry_main():
  ...
  def got_poem(poem):
        poems.append(poem)
        if len(poems) == len(addresses):
            reactor.stop()

,那么两个反应堆都指向同一个反应堆吗?同一事物的多个导入是如何工作的?

还有,为什么不直接定义

代码语言:javascript
复制
from twisted.internet import reactor

在程序的顶部,而不是在使用之前的函数中?

EN

回答 2

Stack Overflow用户

发布于 2013-04-29 12:21:20

twisted.internet.reactor有时没有在模块级别导入的原因是,第一次导入它时,如果还没有显式选择特定的反应堆实现,就会做出默认的选择。一旦选择了实现,就无法更改它。

如果模块在顶层导入twisted.internet.reactor,那么一旦它们被导入,反应堆就会被导入。这使得选择不同的反应堆实现变得有些困难,因为在导入任何在顶层导入twisted.internet.reactor的模块之前,您必须这样做。

因此,一种约定是只导入需要使用它的函数内部的twisted.internet.reactor。这意味着在调用函数之前不会发生导入,这通常已经晚到已经选择了实现。

另一个惯例(包括我自己在内的一些人)是定义接受反应堆作为论据的API。通过这种方式,您根本不导入反应堆,它将与您所需要的任何其他输入一起传递给您。

这种方法的一个最大优点是它使代码更容易进行单元测试。

票数 2
EN

Stack Overflow用户

发布于 2013-04-29 09:57:48

如果仔细看,poetry_main函数中还有另一个poetry_main函数。导入的范围是词法,就像变量和函数一样。

关于这样做的原因,我可以考虑不污染模块的全局命名空间。

Python保存了一个导入模块的内部字典,因此不管一个模块被import编辑了多少次;它将只加载一次,并且它的内部状态将在所有引用之间共享。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16275670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档