【问题标题】:True difference between 'normal' and 'inside-function' imports in PythonPython中“正常”和“内部函数”导入之间的真正区别
【发布时间】:2014-02-05 03:23:41
【问题描述】:

关于这个问题:local-import-statements-in-python,在我提问时在这里引用:

我认为将 import 语句放在尽可能靠近片段的地方 使用它通过使其依赖关系更清晰来提高可读性。将要 Python缓存这个?我应该关心吗?这是个坏主意吗?

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

for i in xrange(10): Process()

多一点理由:它适用于使用神秘比特的方法 库,但是当我将方法重构到另一个文件中时,我没有 意识到我错过了外部依赖,直到出现运行时错误。

我想问以下问题:

  • 在 .py 文件顶部导入模块和从函数定义内部导入模块之间的真正区别是什么?

例如,我个人遇到了 win32com.client 模块的一个特殊问题,当我在文件顶部导入模块时,我的脚本崩溃了,但奇怪的是,在我从内部调用 import 语句后,它似乎可以正常执行依次调用其方法之一的函数。

有关这方面的更多信息,请在此处查看我的其他帖子:How to launch win32 applications in separate threads in Python

我怀疑这种行为与 locals() 和 globals() 在某些情况下被不同地更新或根本不更新有关...... 请赐教。

【问题讨论】:

  • 请注意,在函数中不能使用 * 导入。 (它们在旧版本的 python 中是允许的......)。其中一部分我认为没有其他大的区别。

标签: python import module globals locals


【解决方案1】:

处理导入的方式没有区别(需要注意的是,正如该问题的答案所述,导入的名称仅在导入它的代码范围内可用:因此,如果它是在函数内部完成的,名称是该函数的本地名称)。

主要区别 - 也是您可能想要在函数中执行导入的唯一充分理由 - 是在模块本身首次导入时执行顶层的任何内容。这可能导致循环导入的可能性:如果两个文件都在顶层相互导入,则循环无法解决,Python 将引发异常。

【讨论】:

  • 那么,例如,一些写得不好的模块是否可以使用 locals()[x] 函数查找属性,然后在它应该查看 globals()[x] 时吐出错误?据我所知,如果我进行本地导入,则不应更新 globals()...
  • 实际上循环导入暗示导入将失败。仅当 两个 模块的“主体”必须引用另一个模块的某些内容时,这才是正确的。如果其中一个模块仅在函数定义中使用另一个模块(在导入过程中执行),那么您是安全的(大多数情况下都是如此)。即使在糟糕的情况下,也有机会通过首先定义另一个模块所需的东西然后importing 另一个模块来修复导入错误。然而,这种设计很快就会变得复杂。
猜你喜欢
  • 2018-04-06
  • 2012-11-21
  • 2012-07-30
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多