- Python
- 技術 💻
Python標準ライブラリ8選|graphlib・singledispatch・batched・NFKC
Pythonを何年か書いていても、標準ライブラリの奥のほうって、意外と見ていないんですよね。「これは自作するしかない」と思って書いたものが、実は最初から入っていたりします。
今回は、知って「ほぉー」となったものを8つ集めました。その処理、自作しなくていいやつかもしれません。書き慣れている方ほど、刺さるやつを選んでいます。
① 依存関係の解決が、標準ライブラリに入っています
これを知ったときは、けっこう驚きました。
「AはBの後、BはCの後に実行する」みたいな依存関係を解いて、正しい順番を出したい。タスクの実行順、ビルドの順序、テーブルの作成順とか。自分でグラフを組んで、深さ優先探索を書いて……とやりがちですよね。標準に入っています。
from graphlib import TopologicalSorter
graph = {
"デプロイ": {"テスト"},
"テスト": {"ビルド"},
"ビルド": {"依存解決"},
}
ts = TopologicalSorter(graph)
print(list(ts.static_order()))
# ['依存解決', 'ビルド', 'テスト', 'デプロイ']
しかも循環していたら、CycleError でちゃんと教えてくれます。自作すると地味に大変なやつが、3行で終わるんですよね。
② if isinstance の連打が、標準で消せます
型ごとに処理を分けたいとき、isinstance の分岐を並べていませんか。functoolsの singledispatch で、型ごとの実装に分割できます。
from functools import singledispatch
@singledispatch
def dump(v):
return str(v)
@dump.register
def _(v: bool):
return "はい" if v else "いいえ"
@dump.register
def _(v: list):
return ", ".join(map(str, v))
print(dump(True)) # はい
print(dump([1, 2])) # 1, 2
型注釈を見て、いちばん近い実装に振り分けてくれます。boolはintのサブクラスですが、より具体的な方が勝つのも賢いところです。分岐が増えるたびに、関数を1個足すだけ。ifの塊を育てなくて済むんですよね。
③ 「n個ずつに分割」が、ついに標準入りしました
API送信やDBのバルクインサートで、リストを500件ずつに割る処理。全員が一度は自作しているんじゃないでしょうか。Python 3.12から、itertoolsに入りました。
from itertools import batched
for chunk in batched(range(1, 8), 3):
print(chunk)
# (1, 2, 3)
# (4, 5, 6)
# (7,)
端数のチャンクもちゃんと出ます。あのwhileとスライスの自作コード、もう書かなくていいんです。
④ 「隣同士のペア」も、標準で作れます
前日比、区間の差分、連続チェック。zip(a, a[1:]) と書いてきたやつです。3.10からは pairwise があります。
from itertools import pairwise
prices = [100, 130, 125, 160]
print([b - a for a, b in pairwise(prices)])
# [30, -5, 35]
スライスのコピーを作らないので、イテレータのままメモリに優しく回せます。読んだ人に意図が一発で伝わるのもいいんですよね。
⑤ try/except/pass は、1行になります
「無ければ無いでいい」削除処理、こう書いていませんか。
try:
os.remove("tmp.lock")
except FileNotFoundError:
pass
contextlibの suppress で、こうなります。
from contextlib import suppress
with suppress(FileNotFoundError):
os.remove("tmp.lock")
行数が減るだけじゃなくて、「この例外は握りつぶす意図です」が名前で伝わるのが本領です。レビューでの会話が1往復減ります。
⑥ zipは、短い方に合わせて黙って打ち切ります
これは知らないとバグります。
names = ["田中", "佐藤", "鈴木"]
scores = [80, 90]
list(zip(names, scores))
# [('田中', 80), ('佐藤', 90)] ← 鈴木さんが消えている
エラーにならないので、気づかないんですよね。Python 3.10からは、こう書けます。
list(zip(names, scores, strict=True))
# ValueError: zip() argument 2 is shorter than argument 1
データを突き合わせる処理では、必ず付けた方がいいと思います。
⑦ TOMLパーサが、標準に入っています
pyproject.tomlの時代なのに、TOMLを読むのに外部ライブラリを入れていませんか。3.11から tomllib が標準です。
import tomllib
with open("pyproject.toml", "rb") as f:
cfg = tomllib.load(f)
「ほぉー」ポイントが2つあって、開くのはバイナリモード("rb")必須なこと。そして読み込み専用で、書き出しは入っていないことです。設定は読むもの、という割り切りなんですよね。
⑧ 全角と半角の揺れは、1行で吸収できます
最後は日本語を扱う方向けです。知っている方はおさらいで。「RJC」と「RJC」、「ガ」と「ガ」。見た目は同じでも、コンピュータには別物ですよね。
import unicodedata
s = "RJC ガイド 123"
print(unicodedata.normalize("NFKC", s))
# 'RJC ガイド 123'
全角英数は半角に、半角カナは全角に、濁点も1文字に統合。入力値を保存する前に、これを通すだけで、検索がヒットしない問題がかなり減るんです。
番外編:コマンドライン一発芸
覚えておくと便利なものを3つ。
importの遅い犯人を探す
python -X importtime -c "import json"
起動が遅いスクリプトの、どのimportに時間がかかっているかをツリーで出してくれます。
SQLiteの対話シェルを開く(3.12〜)
python -m sqlite3
sqlite3コマンドが入っていない環境でも、その場でSQLが叩けます。
カレンダーを出す
python -m calendar 2026
1年分のカレンダーがターミナルに出ます。日付の確認に地味に便利です。
RJCでも、Pythonを使っています
Techチームでは、過去のExcel設計書から指摘事項をPythonで抽出して、その結果をAIで構造化する、といった取り組みをしています。セルフレビュー用のチェック表を作って、レビューする側の負担を減らしたんですよね。
こういう「地味だけど時間がかかる作業」を減らす工夫を、みんなで持ち寄っています。
よくいただくご質問
Q. どれから使うのがいいですか?
A. ⑤のsuppressかなと思います。今日の業務コードからそのまま置き換えられて、レビューでも意図が伝わりやすくなります。
Q. バージョンの条件をまとめてもらえますか?
A. graphlibは3.9以降、pairwiseとzip(strict=True)は3.10以降、tomllibは3.11以降、batchedとpython -m sqlite3は3.12以降です。使う前にご確認ください。
Q. 標準ライブラリって、どうやって知るんですか?
A. 「これ自作するの面倒だな」と思ったときに、公式ドキュメントの目次を眺めるのがおすすめです。だいたい誰かが同じことを面倒だと思っていて、入っているんですよね。
Q. 業務コードは、どこまで標準に寄せるべきですか?
A. 迷ったら標準を先に確認、で十分だと思います。依存が1つ減るだけで、環境構築もアップデート追従も確実に楽になります。
「入っているかも」と疑う習慣
今日の8つに共通しているのは、自作する前に、標準を疑う価値があるということでした。Pythonの標準ライブラリは本当に厚いので、「これは書くしかない」と思ったときこそ、一度目次を見てみてください。
書かなかったコードは、バグらないんですよね。
みなさんの「これも標準に入ってるよ」も、よかったら教えてください。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。