这篇还是总结一下自己关于模块与包有遗漏或者不知道的地方,学习路上,还需共勉。
一、 控制模块被全部导入的内容
当我们使用import * 时,会导入模块内所有元素,那么怎么才能控制import * 的内容呢?
遗漏点:在你的模块中定义一个变量 __all__ 来明确地列出需要导出的内容。
def spam(): pass def grok(): pass blah = 42 # Only export 'spam' and 'grok' __all__ = ['spam', 'grok']
这样我们在导入的时候,只会导入__all__所包含的模块。
二、你可能有大量的代码,由不同的人来分散地维护。每个部分被组织为文件目录,如一个包。然而,你希望能用共同的包前缀将所有组件连接起来,不是将每一个部分作为独立的包来安装。
假设你有Python代码的两个不同的目录如下:
foo-package/ spam/ blah.py bar-package/ spam/ grok.py
在这2个目录里,都有着共同的命名空间spam。在任何一个目录里都没有__init__.py文件。
>>> import sys >>> sys.path.extend(['foo-package', 'bar-package']) >>> import spam.blah >>> import spam.grok
三、你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令。
>>> import importlib >>> math = importlib.import_module('math') >>> math.sin(2) 0.9092974268256817 >>> mod = importlib.import_module('urllib.request') >>> u = mod.urlopen('http://www.python.org')
import_module只是简单地执行和import相同的步骤,但是返回生成的模块对象。你只需要将其存储在一个变量,然后像正常的模块一样使用。
如果你正在使用的包,import_module()也可用于相对导入。但是,你需要给它一个额外的参数。例如:
import importlib # Same as 'from . import b' b = importlib.import_module('.b', __package__)