其他答案表明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社区将所有导入语句放在模块范围的模块顶部。
这将是一个非常好的“with(import StringIO)as moduleName:syntax – JeremyKun 2012-02-07 21:31:37
@Bean:如果这样你不必输入长或笨拙的模块名称,那么有一个简单的方法:''导入StringIO'然后'sio = StringIO',现在你可以执行'file_handle = sio.StringIO('hello world')'并保存那些宝贵的五个字符,但我会尽量少用这个,因为它可以使代码变得更难(这项任务很容易被忽略;非标准的模块名称可能会让人分心) – cvoinescu 2012-05-02 21:30:32