Jim*_*imB 49 python python-import
如果代码的某个子模块加载了大型模块,那么从该命名空间引用该模块而不是再次导入该模块是否有任何好处?
例如:我有一个模块MyLib,它广泛使用ReallyBigLib.如果我有导入MyLib的代码,我应该像这样挖出模块
import MyLib
ReallyBigLib = MyLib.SomeModule.ReallyBigLib
Run Code Online (Sandbox Code Playgroud)
要不就
import MyLib
import ReallyBigLib
Run Code Online (Sandbox Code Playgroud)
Ton*_*uža 70
Python模块可以被认为是单例...无论你导入多少次它们只被初始化一次,所以最好这样做:
import MyLib
import ReallyBigLib
Run Code Online (Sandbox Code Playgroud)
关于进口声明的相关文件:
https://docs.python.org/2/reference/simple_stmts.html#the-import-statement
一旦知道模块的名称(除非另有说明,术语"模块"将指代包和模块),搜索模块或包可以开始.检查的第一个位置是sys.modules,它是之前导入的所有模块的缓存.如果在那里找到该模块,则在导入的步骤(2)中使用它.
导入的模块缓存在sys.modules中:
这是一个将模块名称映射到已加载的模块的字典.这可以被操纵以强制重新加载模块和其他技巧.请注意,从此字典中删除模块与在相应模块对象上调用reload()不同.
Cha*_*iam 37
正如其他人所指出的那样,Python维护了一个已导入的所有模块的内部列表.第一次导入模块时,模块(脚本)在其自己的命名空间中执行,直到结束,内部列表更新,并在import语句后继续执行.
试试这段代码:
# module/file a.py
print "Hello from a.py!"
import b
# module/file b.py
print "Hello from b.py!"
import a
Run Code Online (Sandbox Code Playgroud)
没有循环:只有缓存查找.
>>> import b
Hello from b.py!
Hello from a.py!
>>> import a
>>>
Run Code Online (Sandbox Code Playgroud)
Python的一个优点是如何将所有内容转移到在命名空间中执行脚本.
警告:Python不保证模块不会被初始化两次.我纠结了这个问题.见讨论:http: //code.djangoproject.com/ticket/8193
归档时间: |
|
查看次数: |
17824 次 |
最近记录: |