python死磕六之模块与包

  这篇还是总结一下自己关于模块与包有遗漏或者不知道的地方,学习路上,还需共勉。

  一、 控制模块被全部导入的内容

  当我们使用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__)
原文地址:https://www.cnblogs.com/jimmyhe/p/10821513.html