這三個關於Python包匯入的知識點你知道嗎?

安全劍客發表於2021-01-16

這三個關於Python包匯入的知識點你知道嗎?這三個關於Python包匯入的知識點你知道嗎?

1. 使用 __all__ 控制可被匯入的變數

使用 from module import * 預設情況下會匯入 module 裡的所有變數,若你只想從模組中匯入其中幾個變數,可以在 module 中使用 __all__ 來控制想要被其他模組匯入的變數。

# profile.py 
name='小明' 
age=18 
 
__all__=['name']

開啟 python console 驗證一下

>>> from profile import * 
>>> print(name) 
小明 
>>> print(age) 
Traceback (most recent call last): 
  File "", line 1, inNameError: name 'age' is not defined 
__all__ 僅對於使用from module import * 這種情況適用。

它經常在一個包的 __init__.py 中出現。

2. 名稱空間包的神奇之處

名稱空間包,對於不少人來說,可能是一個陌生的名字。

與我們熟悉的常規包不同的是,它沒有 __init__.py 檔案。

更為特殊的是,它可以跨空間地將兩個不相鄰的子包,合併成一個虛擬機器的包,我們將其稱之為 名稱空間包。

例如,一個專案的部分程式碼佈局如下

foo-package/ 
    spam/ 
        blah.py 
 
bar-package/ 
    spam/ 
        grok.py

在這2個目錄裡,都有著共同的名稱空間spam。在任何一個目錄裡都沒有__init__.py檔案。

讓我們看看,如果將foo-package和bar-package都加到python模組路徑並嘗試匯入會發生什麼?

>>> import sys 
>>> sys.path.extend(['foo-package', 'bar-package']) 
>>> import spam.blah 
>>> import spam.grok 
>>>

當一個包為名稱空間包時,他就不再和常規包一樣具有 __file_ 屬性,取而代之的是 __path__

>>> import sys 
>>> sys.path.extend(['foo-package', 'bar-package']) 
>>> import spam.blah 
>>> import spam.grok 
>>> spam.__path__ 
_NamespacePath(['foo-package/spam', 'bar-package/spam']) 
>>> spam.__file__ 
Traceback (most recent call last): 
    File "", line 1, inAttributeError: 'module' object has no attribute '__file__'
3. 模組過載中的一個坑

由於有 sys.modules 的存在,當你匯入一個已匯入的模組時,實際上是沒有效果的。

為了達到模組的過載,有的人會將已匯入的包從 sys.modules 中移除後再匯入

就像下面這樣子

>>> import foo.bar 
successful to be imported 
>>> 
>>> import foo.bar 
>>> 
>>> import sys 
>>> sys.modules['foo.bar']>>> del sys.modules['foo.bar'] 
>>> 
>>> import foo.bar 
successful to be imported

上面的例子裡我使用的是import foo.bar ,如果你使用的是 from foo import bar 這種匯入形式,會發現過載是同樣是無效的。

這應該算是一個小坑,不知道的人,會掉入坑中爬不出來。

>>> import foo.bar 
successful to be imported 
>>> 
>>> import foo.bar 
>>> 
>>> import sys 
>>> del sys.modules['foo.bar'] 
>>> from foo import bar 
>>>

因此,在生產環境中可能需要避免重新載入模組。而在除錯模式中,它會提供一定的便利,但你要知道這個過載的弊端,以免掉入坑裡。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2750485/,如需轉載,請註明出處,否則將追究法律責任。

相關文章