整理匯入結構

開發 Python 套件

James Fulton

Climate informatics researcher

未在套件中匯入時

import mysklearn
help(mysklearn.preprocessing)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'mysklearn' has no 
  attribute 'preprocessing'

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

未在套件中匯入時

import mysklearn.preprocessing
help(mysklearn.preprocessing)
Help on package mysklearn.preprocessing in 
mysklearn:

NAME
    mysklearn.preprocessing - A subpackage 
      for standard preprocessing operations.

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

未在套件中匯入時

import mysklearn.preprocessing
help(mysklearn.preprocessing.normalize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 
  'mysklearn.preprocessing' has no attribute
  'normalize'

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

未在套件中匯入時

import mysklearn.preprocessing.normalize
help(mysklearn.preprocessing.normalize)
Help on module mysklearn.preprocessing.normalize
in mysklearn.preprocessing:

NAME
    mysklearn.preprocessing.normalize - A module
      for normalizing data.

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

將子套件匯入套件中

mysklearn/__init__.py

絕對匯入

from mysklearn import preprocessing
  • 最常用——更明確

相對匯入

from . import preprocessing
  • 有時使用——更短且有時更簡潔

含子套件的套件目錄樹

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

匯入模組

我們把 preprocessing 匯入 mysklearn

import mysklearn
help(mysklearn.preprocessing)
Help on package mysklearn.preprocessing in 
mysklearn:

NAME
    mysklearn.preprocessing - A subpackage 
      for standard preprocessing operations.

preprocessing 尚未連到 normalize

import mysklearn
help(mysklearn.preprocessing.normalize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 
  'mysklearn.preprocessing' has no attribute
  'normalize'
開發 Python 套件

匯入模組

mysklearn/preprocessing/__init__.py

絕對匯入

from mysklearn.preprocessing import normalize

相對匯入

from . import normalize

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

重構匯入方式

import mysklearn
help(mysklearn.preprocessing.normalize.normalize_data)
Help on function normalize_data in module
mysklearn.preprocessing.normalize:

normalize_data(x)
    Normalize the data array.
開發 Python 套件

將函式匯入子套件

mysklearn/preprocessing/__init__.py

絕對匯入

from mysklearn.preprocessing.normalize import \
    normalize_data

相對匯入

from .normalize import normalize_data

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

將函式匯入子套件

import mysklearn
help(mysklearn.preprocessing.normalize_data)
Help on function normalize_data in module
mysklearn_imp.preprocessing.normalize:

normalize_data(x)
    Normalize the data array.
開發 Python 套件

在同層模組間匯入

normalize.py

絕對匯入

from mysklearn.preprocessing.funcs import (
    mymax, mymin
)

相對匯入

from .funcs import mymax, mymin

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
開發 Python 套件

跨遠位置模組間匯入

自訂例外 MyExceptionutils.py

normalize.pystandardize.pyregression.py

絕對匯入

from mysklearn.utils import MyException

相對匯入

from ..utils import MyException

含子套件的套件目錄樹

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
開發 Python 套件

相對匯入小抄

  • from . import module
    • 從目前目錄匯入 module
  • from .. import module
    • 從上一層目錄匯入 module
  • from .module import function
    • 從目前目錄的模組匯入 function
  • from ..subpackage.module import function
    • 從上一層目錄的子套件中之 module 匯入 function
開發 Python 套件

一起來練習吧!

開發 Python 套件

Preparing Video For Download...