1. 程式人生 > >Python專案中如何優雅的import

Python專案中如何優雅的import

Python專案中如何優雅的import

前言

  • 之前有一篇關於Python編碼規範的隨筆, 但是寫的比較雜亂, 因為提到了import語句, 在篇文章中, 我專門來講Python專案中如何更好的import

標準庫與第三方庫的匯入

  • 匯入一個模組, 如果模組名太長, 則使用import as; 如果是匯入子模組, 則使用from import as
  • 如果需要匯入類的, 則使用from import匯入類, 如果要匯入某一個模組的多各類的話, 則類名使用逗號分隔
  • 示例
    1. 匯入sklearn中的svm中的SVC類
    
    import sklearn.svm
    from sklearn.svm import SVC
    1. 匯入numpy中的random模組
    
    import numpy.random as nprand
  • 總結: 如果匯入類的話, 一定是import somemod 和 from somemod import class兩個語句組成的; 如果匯入一個不同的模組的則, 則一般就是import somemod

專案模組匯入

  • 專案目錄
wxoa ›› tree -Cl
.
├── main.py
├── test
└── wxoa
    ├── __init__.py
    ├── __pycache__
    │   └── __init__.cpython-35.pyc
    ├── entity
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-35.pyc
    │   │   └── user.cpython-35.pyc
    │   └── user.py
    └── util
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-35.pyc
        │   └── ioutil.cpython-35.pyc
        └── ioutil.py

7 directories, 12 files
  • 主程式為main.py, 專案名為wxoa, 存放原始碼的目錄也叫wxoa, 也是一個python package
  • 匯入規則
    • 存在python package(所以這裡不包含main.py)中的python檔案包匯入的規則
      • 使用from . import somemod匯入當前目錄下的模組
      • 使用from ..somemod import submod匯入上一級目錄的somemod目錄下的submod模組
      • 如果名稱太長則使用as縮減
    • 不在python package(就是這裡的main.py和test目錄下的檔案)中的python檔案的匯入規則
      • 使用from somemod.submod.subsubmod import some匯入, 注意這裡不使用.號起頭, 關於使用., ..的作用在下面會說明, 如果使用了.起頭則會報錯, 提示父模組沒有載入
      • 其中somemod就是我們的原始碼的python package包名, 在這裡就是wxoa
      • 如果名稱太長則使用as縮減

關於.和..

  • 在包匯入中, 如果出現了.和..起頭, 則會涉及到package(不是module)的關係, ..表示上一級package, 這個上一級package需要有一個__init__.py才是合法的, .表示當前package, 當前package需要有一個__init__.py才是合法的

  • .和..涉及到的python程式的啟動項, 這裡會比較複雜, 簡而言之, 在涉及到..表示的上級package的時候, 如果python程式的啟動檔案就是在這裡則Python直譯器不會認為..表示的上級目錄的package是一個合法的目錄, 儘管有__init__.py檔案, 因此會報錯; 這樣就給程式碼測試帶來的麻煩, 不能直接在使用..和.中直接測試程式碼, 也就是
    if __name__ == '__main__': pass
    因為這樣已啟動程式就會報錯, 所以報錯, 在下面提出解決方案

關於.和..帶來的麻煩的解決方案

  • 和上面展示的專案目錄一樣, 主啟動程式, 專案原始碼(主要是模組), 測試程式碼分離, main.py在專案目錄下, test(普通的資料夾, 存放python測試檔案)也在專案目錄下, 專案原始碼就是wxoa
  • 在main.py和test目錄下的python檔案中匯入自己專案中的模組, 就不要使用.和..起頭了, 否則會報錯, 而是使用絕對路徑, 如這裡的, from wxoa.service import user