Python Packaging 101

Author

Ryo Nakagami

Published

2024-11-29

Modified

2025-12-06

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_OVERFLOWTOTAL のように ALL_CAPS + アンダースコア の形式を用いる
  • ソース: Guido van Rossum and Barry Warsaw and Nick Coghlan (2001)

モジュールとして import される場合,トップレベルに定義することで

  • 読み手にとって予測可能
  • かつ毎回の関数呼び出しで再生成するコストを削減(=パフォーマンス向上)

となります.分析スクリプトの場合は Readability counts の指針に基づき,状況に応じて「main 相当」のトップ領域に置くことでコードの可読性 を高めるなどの柔軟な対応で良いと思います(=実行環境より読み手の文脈が優先).