2016年8月21日 星期日

Python 程式筆記 -- 模組化設計

原本想先提一下這星期用 Python 和 Qt5 寫「浮動工具列」的雛形,但卻寫成『沒有開始功能表的 Windows 生活 (4)』,只好把那部份的故事暫且打住,先專心來介紹 Python 程式心得。

雖然看了一些「Python 模組化」的介紹,也追了幾個程式的模組流程:

小程式

大程式

但自己實作時,還是有點撞牆,主要的重點在:

.

Python 的命名空間 (Name Space),是以目錄結構來定義,

Python 的命名空間 (Name Space),是以目錄結構來定義。在主程式 bZmenu.py,要使用 src.bZmenu. 來參照到兩層子目錄底下的 mainwindow.py 裡面的 MainWindow class。

    from src.bZmenu.mainwindow import MainWindow

而其他的模組則以 src.bZmenu.xxxx. 等來參照 (落落長?), 此時「相對參照」會讓程式變的簡捷。例如: mainwindow.py 參照到同一個目錄的 commander.py

    from . import commander as cmd

下一層 plugin 目錄的 pluginloader.py 也是用相對參照

    from . plugin import pluginloader

並且記得每個模組底下要有空的 __init__.py

.

2016-08-21 143736-bZmenu - [D__Dropbox_Coding_py_bZmenu] - ..._src_bZmenu_plugin_FileManager_explo

.

子模組單元測試的參照方式

對子模組進行單元測試時,通常會加上類似的程式碼,讓子模組可以單獨執行:

if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainWindow(os.path.join(os.getcwd(),"../.."))
main.show()
sys.exit(app.exec_())

這時,會遇到這樣的錯誤訊息:

Parent module '' not loaded, cannot perform relative import

找到的解法 是:

try:
import commander as cmd
except ImportError:
from . import commander as cmd

讓兩種參照方式可以依情況切換。

.

延伸閱讀

.

0 意見:

發表您的回應

張貼留言