インポートの構造化

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 - 標準的な前処理のためのサブパッケージ。

サブパッケージを含むパッケージのディレクトリ構成

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 - データを正規化するモジュール。

サブパッケージを含むパッケージのディレクトリ構成

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パッケージ開発

モジュールをインポートする

preprocessingmysklearn にインポートしました

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

NAME
    mysklearn.preprocessing - 標準的な前処理のためのサブパッケージ。

ただし preprocessingnormalize へリンクしていません

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)
    データ配列を正規化します。
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)
    データ配列を正規化します。
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
    • 1 つ上のディレクトリから module をインポート
  • from .module import function
    • 現在のディレクトリのモジュールから function をインポート
  • from ..subpackage.module import function
    • 1 つ上のディレクトリのサブパッケージ内の module から function をインポート
Pythonパッケージ開発

Ayo berlatih!

Pythonパッケージ開発

Preparing Video For Download...