当前位置: 首页 > 面试题库 >

Python中的本地导入语句

单于俊智
2023-03-14
问题内容

我认为将import语句放在靠近使用它的片段的位置,可以通过使其依赖项更加清晰来提高可读性。Python会缓存吗?我应该在乎吗?这是一个坏主意吗?

def Process():
    import StringIO
    file_handle=StringIO.StringIO('hello world')
    #do more stuff

for i in xrange(10): Process()

还有一点理由:这是针对使用库中奥秘功能的方法的,但是当我将方法重构为另一个文件时,我没有意识到我会错过外部依赖项,直到遇到运行时错误。


问题答案:

其他答案似乎对import真正的工作方式略有困惑。

这个说法:

import foo

大致等效于以下语句:

foo = __import__('foo', globals(), locals(), [], -1)

也就是说,它将在当前作用域中创建一个与所请求的模块同名的变量,并为其分配__import__()使用该模块名和大量默认参数的调用结果。

__import__()函数从概念上将字符串'foo')转换为模块对象。模块被缓存在sys.modules,这是第一位__import__()的外观-
如果sys.modules中有一个条目'foo',这就是__import__('foo')要回来,不管它是什么。它真的不在乎类型。您可以自己查看此操作。尝试运行以下代码:

import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop

暂时不考虑样式问题,在函数内使用import语句可以实现所需的功能。如果模块从未被导入过,它将被导入并缓存在sys.modules中。然后,它将模块分配给具有该名称的局部变量。它不会
修改任何模块级别的状态。它可能 确实 会修改某些全局状态(向sys.modules添加新条目)。

也就是说,我几乎从未import在函数内部使用过。如果导入模块会在您的程序中造成明显的减速(例如它在静态初始化中执行了很长的计算,或者它只是一个庞大的模块),而您的程序很少真正需要该模块来执行任何操作,那么只在内部导入就可以使用它的功能。(如果这很令人反感,Guido会跳入他的时间机器,并更改Python以阻止我们这样做。)但是,通常,我和Python一般社区将我们所有的import语句放在模块范围内的模块顶部。



 类似资料:
  • 问题内容: 我知道应该避免本地进口,但是在这种情况下需要特殊情况。这是一个私有存储库,由于服务器上缺少私有密钥,因此与绝对URL一起使用时,heroku buildpack在该阶段失败。 现在我得到这个错误。 所有导入路径都已更改为本地版本,那么还有什么可以使软件包成为“非本地”文件呢?我该如何解决? 问题答案: 我修好了它。问题是root软件包在中。一旦我将软件包移到错误处,错误就消失了(因此,

  • 问题内容: 语句有什么作用(在Python 3.0及更高版本中)? 官方Python网站上没有文档,也无法使用。 问题答案: 比较一下,不使用: 对此,使用,其中的是现在还的: 如果要使用global,它将绑定x到正确的“全局”值:

  • 我们知道,Maven 是通过仓库对依赖进行管理的,当 Maven 项目需要某个依赖时,只要其 POM 中声明了依赖的坐标信息,Maven 就会自动从仓库中去下载该构件使用。但在实际的开发过程中,经常会遇到一种情况:某一个项目需要依赖于存储在本地的某个 jar 包,该 jar 包无法从任何仓库中下载的,这种依赖被称为外部依赖或本地依赖。那么这种依赖是如何声明的呢? 下面我们通过一个实例实例来介绍如何

  • 我读了很多与我所问的问题相关的答案,但我仍然不明白如何使我正在尝试的事情成为可能。所以让我们直奔主题。我将报告我的应用程序的简化版本。 null 现在,集群和解析器包中包含的python脚本应该使用support_class中包含的myclass.py。 我尝试了相对导入,但它们不起作用,因为我希望直接运行集群和解析器包中包含的脚本,并且我不想使用-m选项。 python parser.py[参数

  • 问题内容: 我是新手,正在研究要本地化的示例代码。 在原始的导入语句中,它是: 现在我已经和包 所以我将import语句转换为: 但是当我运行时,出现以下错误: 另外,当我在导入语句中使用and 代替and 时,得到: 我怎样才能解决这个问题? 问题答案: 好吧,我发现了问题所在。基本上,导入的开始路径是 所以我只需要在包名称前面添加,即导入应该是:

  • 我有一个python3脚本script.py,我想在其中实例化一个类Foobar,它是在clazz.py中定义的。但是,当我尝试导入时,我得到: script.py: 如果我去掉中的,它就可以正常运行;但是,如果我这样做了,我的IDE(Intellij IDEA)会在导入中加上红色下划线,并且不会自动完成任何内容。我相信在python3中包含是正确的,而且Intellij似乎也喜欢它,那么为什么我