python死磕六之模塊與包
阿新 • • 發佈:2019-05-06
相對 importlib 學習 關於 python代碼 都沒有 總結 sam 沒有
這篇還是總結一下自己關於模塊與包有遺漏或者不知道的地方,學習路上,還需共勉。
一、 控制模塊被全部導入的內容
當我們使用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__)
python死磕六之模塊與包