2016年8月21日 星期日

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

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

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

小程式

大程式

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

.

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

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

  1. from src.bZmenu.mainwindow import MainWindow  

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

  1. from . import commander as cmd  

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

  1. from . plugin import pluginloader  

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

.

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

.

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

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

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

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

Parent module '' not loaded, cannot perform relative import

找到的解法 是:

  1. try:  
  2.     import commander as cmd  
  3. except ImportError:  
  4.     from . import commander as cmd  

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

.

延伸閱讀

.

0 意見:

發表您的回應

張貼留言