与#x27;正常';和';内部功能';用Python导入

与#x27;正常';和';内部功能';用Python导入,python,import,module,globals,locals,Python,Import,Module,Globals,Locals,关于这个问题,在我提问时,这里引用了: 我认为把import语句放在片段附近 通过使依赖关系更加清晰,使用它有助于可读性。将 Python缓存这个?我应该在乎吗?这是个坏主意吗 def Process(): import StringIO file_handle=StringIO.StringIO('hello world') #do more stuff for i in xrange(10): Process() 还有一点理由:这是针对那些使用神秘的数据的方法 库

关于这个问题,在我提问时,这里引用了:

我认为把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将引发异常。

因此,例如,一些写得不好的模块可能会使用locals()[x]函数查找属性,然后在应该查看globals()时抛出错误[x] ??据我所知,如果我进行本地导入,则不应更新globals()。实际上,循环导入并不意味着导入将失败。只有当两个模块的“主体”必须引用另一个模块中的内容时,才是如此。如果其中一个模块仅在函数定义内使用另一个模块(在导入过程中不会执行),则您是安全的(大多数情况下都是如此)。即使在不好的情况下,也有机会通过首先定义其他模块所需的内容,然后导入其他模块来修复导入错误。但是,这种设计很快就会变得复杂。请注意,在函数中不能使用
*
导入。(在python的旧版本中允许使用它们…)。这其中的一部分,我不认为有任何其他大的区别。