Python Packaging 101
Packaging Coding Convention
NoteRULE 1: 共有して使われるコードは,関数内ではなくモジュール直下に定義する
- Python の import はファイル冒頭のトップレベルにまとめる(PEP8)
関数内部で import を行うと
- 関数呼び出し時に毎回
import文が実行される- ただし,モジュール自体は再ロードされず,
sys.modulesのキャッシュが再利用される - キャッシュ確認が毎回走る(パフォーマンスへの影響は小さい)
- ただし,モジュール自体は再ロードされず,
- 静的解析ツールが警告を出してくる可能性がある
- 可読性が下がり,依存関係が把握しにくくなる(
Readability counts)
GOOD
import numpy as np
def compute(x):
return np.mean(x)AVOID
def compute(x):
import numpy as np # 関数内での import はNG
return np.mean(x)
NoteRULE 2: 特殊な理由がある場合にだけ関数内 import
- 使われる場所が1つの関数だけと限定されているケース
関数内で import を書いてよい例としては
- エラー発生時のみ呼ばれる関数
- 異常系・例外処理のための関数
- ログ出力やデバッグ専用で,通常は実行されない関数
がとなり,基本的には「通常の実行フローではまず呼ばれない」場合に限定されます.
NoteRULE 3: モジュールレベルでの定数の扱い
- 基本,定数はモジュールのトップレベルで定義する
MAX_OVERFLOWやTOTALのように ALL_CAPS + アンダースコア の形式を用いる- ソース: Guido van Rossum and Barry Warsaw and Nick Coghlan (2001)
モジュールとして import される場合,トップレベルに定義することで
- 読み手にとって予測可能
- かつ毎回の関数呼び出しで再生成するコストを削減(=パフォーマンス向上)
となります.分析スクリプトの場合は Readability counts の指針に基づき,状況に応じて「main 相当」のトップ領域に置くことでコードの可読性 を高めるなどの柔軟な対応で良いと思います(=実行環境より読み手の文脈が優先).