1. 程式人生 > >python死磕六之模塊與包

python死磕六之模塊與包

相對 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死磕六之模塊與包