Q1標準ライブラリと外部ライブラリの違いとして、正しいものはどれですか?
標準ライブラリの分類 — どの場面でどれを使うか
pip install不要の標準ライブラリを実行環境・数値・文字列・データ入出力など7カテゴリに分類し、import math形式とfrom x import * を避ける慣習、ブラウザで動かない範囲まで整理します。
Python の標準ライブラリは、pip install不要でimportするだけで使える数百のモジュール群です。本記事では全体を7 カテゴリに整理します。
標準ライブラリとは — Python に同梱されているモジュール群
標準ライブラリとは、Python をインストールした時点で最初から使えるモジュール群のことです。mathやos、jsonのように、pip installを一切実行せずimportするだけで呼び出せます。
pip installで別途インストールが必要。| 種類 | インストール | 代表例 |
|---|---|---|
| 標準ライブラリ | Python 本体に同梱(不要) | math / os / sys / json / datetime / re / asyncio |
| 外部ライブラリ | pip install で追加 | pandas / numpy / requests / fastapi |
標準ライブラリだけで足りない場面はありますが、まず標準で済まないか試すほうが長期的には楽です。理由は以下の通りです。
- 追加インストール不要で、どこの環境でも動く(社内サーバー、CI、Docker コンテナ、本シリーズが動くブラウザ実行環境も同じ)
- バージョン管理が楽 — Python 本体のバージョンが決まれば付属する標準ライブラリのバージョンも一意に決まる
- 枯れていて壊れにくい — 標準ライブラリは互換性を厳密に守りながら進化しているので、数年単位で書いたコードがそのまま動く
用途で見る 7 カテゴリ
標準ライブラリには数百のモジュールがありますが、用途で 7 つに分類すると、どこに何があるかが整理しやすくなります。本シリーズもこの並びで、上から順に各カテゴリを掘り下げていきます。
| カテゴリ | 代表モジュール | 何ができるか |
|---|---|---|
| A 実行環境とファイル | sys / os / pathlib / shutil | 実行環境を覗く、ファイルとフォルダを操作する |
| B 数値・日時・乱数 | math / statistics / decimal / datetime / random | 数値計算、誤差の少ない金額計算、日付計算、乱数生成 |
| C 文字列・テキスト | re / string / textwrap / pprint | 正規表現で抽出、テンプレ置換、折り返し、整形表示 |
| D データ入出力 | json / csv / pickle / base64 / hashlib | オブジェクトとテキスト/バイト列を相互変換する |
| E データ構造の拡張 | collections / itertools / functools / dataclasses | list や dict より便利なデータ構造に拡張する |
| F リソース管理・運用 | contextlib / logging | with の自作とログ出力で運用しやすいコードに |
| G 並行・並列処理 | asyncio / threading / multiprocessing | 並列に処理を動かす |
1 つのカテゴリに複数モジュールが並んでいるのは、目的が同じでも切り口が違うからです。たとえば B カテゴリのrandomとsecretsは両方とも乱数を生成しますが、randomはゲームやテストデータ向け、secretsはパスワードリセットトークンなどセキュリティ用途に向いた強い乱数を返します。本シリーズではカテゴリごとに、こうした似ているが違うモジュールの使い分けを整理していきます。
import の書き方 — 名前衝突を避ける慣習
標準ライブラリを呼び出すimportには複数の書き方があります(前回の記事 でも詳しく扱っています)。それぞれにメリットと落とし穴があるので、用途に応じて使い分けます。代表的な 4 パターンを整理します。
| 書き方 | 呼び出し例 | 向いている場面 |
|---|---|---|
| import math | math.sqrt(2) | 原則これ。どこのコードに書いても読み手が迷わない |
| import json as J | J.dumps(data) | 1 ファイル内で短い別名を付けたいとき(np / pd など慣習化されたものも同じ) |
| from datetime import datetime | datetime(2024, 1, 1) | そのモジュールから 1〜2 個の名前しか使わないとき |
| from os import * | getcwd() | 原則使わない。名前衝突の温床になる |
import math形式はどのモジュールから来たかが呼び出し側で見えるので、後でコードを読み返すときに迷いません。一方でfrom パッケージ import 関数形式はモジュール名のプレフィックス(接頭辞、math.sqrtのmath.のように関数名の前に付く部分)が消えるので、datetime(2024, 1, 1)のようにスッキリ書けます。
from x import スターは原則禁止
from os import *のようにすべての名前を取り込む書き方は、他のモジュールで定義された同名関数を上書きしてしまうことがあります。たとえばos.open()と組み込みのopen()は別物ですが、from os import *を書くと組み込みのopenがos.openに置き換わって、ファイル読み書きが壊れます。自作モジュールでも標準ライブラリでも避けるのが安全です。
ブラウザで動かない標準ライブラリ — 本シリーズの扱い
本シリーズの演習はブラウザで動く Python ランタイム(MicroPythonまたはPyodide)の上で実行されます。ほとんどの標準ライブラリは問題なく動きますが、OS のスレッド・プロセスを必要とするものだけは、ブラウザの仕組み上どうしても動かせません。また、sys.argv(コマンドライン引数を受け取る仕組み)も実機では動きますが、ブラウザ上では引数を渡す経路がないため動作しません。これらは図解で概念を整理し、実機で書く際にすぐ思い出せる形で残す方針にしています。
multiprocessingやsubprocessのように外側に何かを起動するライブラリは動かない。本シリーズではこれらを図解だけで扱う。| 扱い | 対象モジュール | 理由 |
|---|---|---|
| ハンズオン | math / re / datetime / json / collections / asyncio など多数 | Pyodide / MicroPython でそのまま動く |
| 図解中心 + クイズ | threading / concurrent.futures | ブラウザでは実スレッドが動かないが、概念整理は実務で重要 |
| 図解のみ | multiprocessing / subprocess | OS プロセスがないため実演習が組めない |
なぜ図解だけでも扱うのか
実務では本物の OS で動かす場面が必ず来ます。そのときにthreadingとmultiprocessingの使い分けや、subprocessでのコマンド実行を概念として知っているかどうかで、最初の一歩の踏み出しやすさが大きく変わります。本シリーズでは「ブラウザで動かないから扱わない」ではなく、動かせない部分も図解で整理して、いざ書くときに思い出せる形で残す方針にしています。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2次のうち、原則として避けるべき import の書き方はどれですか?