Python のコードは、目的別に モジュール(ファイル)に分けて書きます。本記事では、標準ライブラリ・サードパーティ・自作モジュールの 3 種類の位置づけと、import の書き方を整理します。
目次
- モジュールとは
- 基本の import
- from … import … — 必要なものだけ取り出す
- as — 別名を付ける
- サードパーティのモジュール
- 標準ライブラリで覚えておくと便利なもの
- 自作モジュールを作る
- パッケージ — モジュールをディレクトリにまとめる
- name == “main” のイディオム
- import の探索順
モジュールとは
モジュールとは「Python のコードが書かれた .py ファイル」のことです。import でモジュールを読み込むと、その中の関数・クラス・定数を別のファイルから使えるようになります。
モジュールの種類は次の 3 つに分かれます。
| 種類 | 入手元 | 例 |
|---|---|---|
| 標準ライブラリ | Python 本体に同梱 | math / datetime / json |
| サードパーティ | pip install で導入 | pandas / numpy / requests |
| 自作モジュール | 自分で作る .py | analysis.py / data_loader.py |
基本の import
最も素朴な形は、モジュール名をそのまま読み込む書き方です。
import math
print(math.sqrt(252)) # 15.874... (年率換算でよく使う sqrt(営業日))print(math.pi) # 3.14159...モジュール内の関数や定数は、モジュール名.名前 の形でアクセスします。
from … import … — 必要なものだけ取り出す
特定の関数や定数だけ使いたい場合は、名前を直接取り出せます。
from math import sqrt, pi
print(sqrt(252)) # 15.874...print(pi) # 3.14159...「math. を毎回書かずに済む」のがメリットですが、別のモジュールにも同じ名前があると衝突します。プロジェクト全体でルールを揃えるのが望ましい書き方です。
as — 別名を付ける
長いモジュール名には別名を付けるのが慣例です。pandas や NumPy では業界全体で略名が決まっています。
import pandas as pdimport numpy as npimport datetime as dt
df = pd.DataFrame({"C": [2900, 2925]})arr = np.array([1, 2, 3])today = dt.date.today()pd / np のような略名は事実上の標準なので、独自の略名は付けないほうがコードが読みやすくなります。
サードパーティのモジュール
サードパーティのモジュールは、自分の環境にインストールしたうえで読み込みます。
pip install requestsimport requests
response = requests.get("https://example.com")print(response.status_code) # 200仮想環境(venv)とインストール手順は#2-3「venv で仮想環境を作る」 / #3-12「pip と requirements.txt とパッケージ管理」 で扱います。
標準ライブラリで覚えておくと便利なもの
株価分析を始めるにあたって、よく使う標準モジュールを挙げておきます。
| モジュール | 主な用途 |
|---|---|
math | 数学関数(sqrt / log など) |
statistics | 平均・分散などの基本統計 |
datetime | 日付・時刻の処理(#3-9「日付と時刻 (datetime)」) |
json | JSON の読み書き(#3-7「ファイルの読み書き(CSV / JSON)」) |
csv | CSV の読み書き(#3-7「ファイルの読み書き(CSV / JSON)」) |
pathlib | ファイルパスの操作 |
os / sys | 環境変数・実行環境 |
「サードパーティを入れる前に、標準ライブラリで足りないか確認する」のが基本姿勢になります。
自作モジュールを作る
同じディレクトリに 2 つの .py ファイルを置きます。
def average(values: list[float]) -> float: return sum(values) / len(values)
def daily_returns(prices: list[float]) -> list[float]: return [ (curr - prev) / prev for prev, curr in zip(prices[:-1], prices[1:]) ]from analysis import average, daily_returns
prices = [100, 102, 101, 103, 105]print(average(prices)) # 102.2print(daily_returns(prices)) # [0.02, -0.0098..., ...]main.py から python main.py で実行すると、analysis.py の関数が使えます。
パッケージ — モジュールをディレクトリにまとめる
複数のモジュールをディレクトリにまとめたものをパッケージと呼びます。Python 3.3 以降は空の __init__.py も不要です(あっても問題ありません)。
project/ main.py analysis/ metrics.py returns.pyfrom analysis.metrics import averagefrom analysis.returns import daily_returnsディレクトリの階層がそのままモジュールパスになります。プロジェクトが大きくなったらこの形に整理します。
name == “main” のイディオム
モジュールが「直接実行されたとき」と「import されたとき」で挙動を変える定石があります。
def average(values: list[float]) -> float: return sum(values) / len(values)
if __name__ == "__main__": # python analysis.py で直接実行されたときだけ動く print(average([100, 102, 101]))python analysis.py だと __name__ が "__main__" になり、from analysis import average だと "analysis" になります。動作確認用のコードを書く場所として便利です。
import の探索順
import は次の順で探索します。
- 組み込みモジュール(
sysなど、Python に内蔵されたもの) sys.pathのディレクトリ(現在の実行ディレクトリ・サイトパッケージ・PYTHONPATH など)
自作モジュールが見つからないときは、実行ディレクトリと自作ファイルの場所を確認します。
import sysprint(sys.path)生成AI へのプロンプト例
モジュール構成を相談する例です。
Python 3.12 で、J-Quants API から株価を取得して日次リターンを計算するプロジェクトを作りたいです。
責務をモジュールに分けるとしたら、どのような構成が適切でしょうか。各モジュールの役割と公開する関数も合わせて提案してください。
制約:- pandas / requests のみ使用- 標準ライブラリ以外は最小に責務分割の意図が共有できると、後の実装でブレが少なくなります(#7-2「データ分析のためのプロンプト設計」)。
まとめ
- モジュールは標準ライブラリ・サードパーティ・自作の 3 種類
import モジュール名かfrom モジュール名 import 名前で読み込む- pandas / NumPy などには事実上の標準の略名がある
- 大きくなったらディレクトリにまとめてパッケージにする