0

关于这个问题: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 语句后,它似乎可以正常执行它的方法之一。

有关这方面的更多信息,请参阅我的另一篇文章:如何在 Python 中的单独线程中启动 win32 应用程序

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

4

1 回答 1

0

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

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

于 2014-01-16T09:39:13.053 回答