Python 中的本地导入语句

2024-01-09

我认为将 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__()包含该模块名称和大量默认参数。

The __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 中。然后它将模块分配给具有该名称的局部变量。确实如此不 不 不修改任何模块级状态。它does可能会修改某些全局状态(向 sys.modules 添加新条目)。

也就是说,我几乎从不使用import在函数内部。如果导入模块会导致程序明显变慢——就像它在静态初始化中执行长时间计算,或者它只是一个巨大的模块——并且您的程序实际上很少需要该模块来完成任何事情,那么仅在内部进行导入是完全可以的使用它的函数。 (如果这令人反感,Guido 会跳进他的时间机器并更改 Python 以阻止我们这样做。)但作为一项规则,我和一般 Python 社区将所有 import 语句放在模块范围内的模块顶部。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的本地导入语句 的相关文章

随机推荐

  • 在编译时完全枚举 D 维数组的索引

    为了测试一些多维结构 需要生成编译时多维索引以完全覆盖所有可能的情况 我寻找编译时廉价的方法来实现上述目的 我目前所做的 include
  • java 10 中使用局部变量类型推断的限制

    Java 10引入了局部变量类型推断特征JEP 286 http openjdk java net jeps 286 我们可以使用局部变量类型推断var这是保留类型名称 但使用它有一些限制 有人可以总结一下在哪些情况下我将无法使用 var
  • 如何在android的城市飞艇中注册apid?

    I have completed client side code by download sample from git for push notification in android After execute of app i go
  • 有条件地更改 Razor 视图中的 CSS 类

    我需要更改 CSS 类 div 带有 forumChild 类的标签 它必须每 3 个循环更改一次 foreach 循环 有没有办法在控制范围内做到这一点 div class Forum p The Forum p foreach var
  • 是否可以在同一帧中打开新的 fxml 文件

    我在锚点窗格中创建了 fxml 文件 但每次我单击按钮时 我都会在新框架中得到下一个 fxml 我希望它在同一帧中打开 public void baropen ActionEvent event handle the event here
  • 导航栏按钮和项目未在 swift 3 中显示

    我在 swift 中以编程方式使用导航栏 但无法在导航栏中显示栏按钮项目 这是我所做的代码 override func viewDidLoad super viewDidLoad let navBar UINavigationBar UIN
  • 存在主义类型。为异构映射编写类的实例

    使用以下类型和类定义 我不明白为什么在创建时会出现错误instance below 我需要 MyMap 来保存异构值的映射 LANGUAGE ExistentialQuantification module Scratch SO Extis
  • 在 Three.js 中将材质分配给 OBJLoader 模型

    我使用以下代码导入了 OBJ 模型 var loader new THREE OBJLoader loader addEventListener load function geometry object geometry content
  • 卸载前检查应用程序是否在 NSIS 中运行

    我是 NSIS 新手 我需要知道在卸载程序中 如何检查应用程序 C 中的 是否正在运行并在卸载之前将其关闭 这是一个稍微更友好的使用版本NS进程 http nsis sourceforge net NsProcess plugin请求应用程
  • 如何在 React 中创建可重用的自定义模态组件?

    我对 React 中的模态概念有疑问 当使用带有 jQ uery 的服务器端渲染模板时 我习惯于有一个始终可用的空全局模态模板 包含在始终扩展的基本模板中 然后 当进行 AJAX 调用时 我只是填充模态 如下所示 modal global
  • 如何在 Flutter 中设置折叠元素的动画

    当用户用动画点击不同的小部件 同级或父级 时 如何展开和折叠小部件 new Column children
  • 如何在 Android 手机上模拟 NFC 标签

    我有一部 Android 手机 nexus s sdk v15 它应使用标签仿真将字符串发送到在 nfc 读取器 写入器模式下运行的开发板 我知道这不是 Android 官方支持的 所以我可以通过直接访问驱动程序来本地完成它 是否有任何人以
  • 如何从 Uri 获取位图?

    如何从 Uri 获取 Bitmap 对象 如果我成功将其存储在 data data MYFOLDER myimage png or file data data MYFOLDER myimage png 在我的应用程序中使用它 有谁知道如何
  • 如何对 MongoDB 中的字段进行加密

    我需要加密 mongo 文档中的一个字段 最好的方法是什么 我用弹簧 有spring注解吗 目前只能通过 java 进行加密 here https stackoverflow com questions 28936242 encrypt p
  • IE8异步文件上传

    我试图找到在 IE8 中异步上传文件 通过 Ajax 的示例代码 上传进度也很好 但不是强制性的 我希望 PHP 代码能够处理文件服务器端 我不断遇到其他浏览器使用 FormData 的示例 但我无法使用它 有人可以指出我正确的方向吗 这是
  • 为什么 :required => true 不适用于 collection_select?

    我想确保用户在提交之前在我的表单中选择一个类别 但是 required gt true似乎不起作用 这是选择 有什么建议吗 Try this 解释 根据 Rails 文档 语法为collection select函数看起来像这样 colle
  • scipy 树形图转 json 用于 d3.js 树可视化

    我正在尝试将 scipy 层次聚类的结果转换为 json 以在 d3 js 中显示一个例子 http bl ocks org mbostock 4063550 以下代码生成具有 6 个分支的树状图 import pandas as pd i
  • Java 到 JavaScript 编译器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 除了 GET 之外 还有其他 Java 到 JavaScript 编译器吗 目前我所有的工作都是用 Ja
  • 在 C++ 中存储任意对象的列表

    在 Java 中 您可以拥有一个对象列表 您可以添加多种类型的对象 然后检索它们 检查它们的类型 并针对该类型执行适当的操作 例如 如果代码不完全正确 我深表歉意 我是凭记忆写的 List list new LinkedList list
  • Python 中的本地导入语句

    我认为将 import 语句放置在靠近使用它的片段的位置 可以使其依赖关系更加清晰 从而提高可读性 Python 会缓存这个吗 我应该关心吗 这是一个坏主意吗 def Process import StringIO file handle