這三個關於Python包匯入的知識點你知道嗎?
使用 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 中出現。
名稱空間包,對於不少人來說,可能是一個陌生的名字。
與我們熟悉的常規包不同的是,它沒有 __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__'
由於有 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 這三個關於Python包匯入的知識點你知道嗎Python
- 關於JVM,你必須知道的這些知識點JVM
- 這些關於WebSocket的知識,你知道多少?Web
- 關於python,你知道它的優缺點嗎?Python
- 關於Mysql事務,你必須知道的幾個知識點!MySql
- 初識python你應該知道的6個知識點!Python
- Python入門必須知道的11個知識點Python
- 年終小盤點:這十八個Android開發必備知識點,你都知道嗎?Android
- 關於Flutter 您必須知道的知識點!!!Flutter
- Netty中的這些知識點,你需要知道!Netty
- 關於美顏SDK,還有這些你不知道的知識
- Python匯入包報錯(沒有這個包)Python
- 關於Python包和模組的10個知識清單Python
- 入門Java開發,這三大知識體系你要知道Java
- 關於Linux系統,這些知識你都瞭解嗎?Linux
- 關於range的一個知識點
- 你需要知道這些關於技術美術的知識構成
- 你想知道的關於 Refs 的知識都在這了
- 前端關於單點登入的知識前端
- 關於Promise知識點都在這裡Promise
- 程式猿必須知道的關於 Tomcat 的知識點Tomcat
- 關於知識付費原始碼,你知道多少?原始碼
- 初學Python必須知道的11個知識點!Python
- 關於python,你有什麼想要知道的嗎?Python
- 關於Linux系統,這些你都知道嗎?Linux
- 入門Python,這些優點你要知道!Python
- 關於前端應該知道的5個小知識前端
- Python中關於Thread的一點小知識Pythonthread
- 關於索引必須知道的知識索引
- 關於Python學習的方法以及技巧,你都知道嗎?Python
- 這幾個好用的Python開源框架,你都知道嗎?Python框架
- 華為雲GaussDB(DWS)記憶體知識點,你知道嗎?記憶體
- 你應該知道的緩動知識點
- 小研帶你學Python(三):關於變數,這些知識你應該要了解一下Python變數
- 這些Python騷操作,你知道嗎?Python
- 面試官帶你學Android——面試中Handler 這些必備知識點你都知道嗎?面試Android
- Python常用的開源框架,這三個你必須知道!Python框架
- 關於Python Number 相關的知識!Python