Tools

Claude Code が書きがちな Python コードを読めるようになろう①

投稿日:

はじめに

Claude Code などのコーディングエージェントは、タスクを進める途中で、その場で Python コードを書いてインラインで実行することがあります。 gh の JSON 出力を整形したり、SQL ファイルから件数を数えたりと、シェル芸だけでは面倒な処理を Python で埋めてくることが多いです。
自分の Claude Code の会話履歴( ~/.claude/projects/*.jsonl )を全て集計してみたところ、意外にも、その場で書いて実行するコードは 10 プロジェクトを合わせても 20 件強でした。ただし、出てくる場所と使うパターンは決まっていて、標準ライブラリのごく一部で足りるものがほとんどです。
この記事では、集計から見えてきた頻出パターンを整理して、Claude が書いた Python コードを読むために押さえておきたい要素をまとめます。

Claude が Python を呼ぶ 3 つの形

Claude が Python を実行する方法は、大きく 3 つに分かれます。

  • python3 -c '...' … 1〜2 行のワンライナー。シェルパイプの一部として使う
  • python3 << 'PY' ... PY … ヒアドキュメント。数十行の処理をシェル履歴に残す
  • python3 foo.py … Write ツールで .py ファイルを書いてから実行

私の履歴では、 -c が 13 件、ヒアドキュメントが 7 件、 .py ファイルの作成は 2 件でした。1 回きりの処理なら -c かヒアドキュメント、繰り返し使うものだけを .py に書き出す使い分けになっています。

パターン 1: JSON をパイプで整形する

もっともよく出てくるパターンです。 gh api や curl の JSON 出力から、必要なフィールドだけを抜き出すのに使います。
たとえば、GitHub の PR コメントを整形する処理はこのような形になります。

シェルの引用符の中に詰め込まれていて読みにくいので、Python コードの部分だけを取り出して整形すると、次の処理をしていることが分かります。

見るべき要素は 3 つあります。

  • json.load(sys.stdin) … 標準入力の JSON をパースして Python のオブジェクトに変換します。ファイルから読むときは json.load(open(path)) 、文字列から読むときは json.loads(s) です。名前が似ていて紛らわしいのですが、末尾の s は string の s と覚えておくと迷いません。
  • 内包表記 [{...} for c in comments] … リストを 1 行で組み立てる書き方です。詳しくは次の節で説明します。
  • json.dumps(..., ensure_ascii=False, indent=2) … Python オブジェクトを JSON 文字列に戻します。 indent=2 は改行付きで整形、 ensure_ascii=False が日本語プロジェクトでは特に重要です。
    loadと同様にこちらも json.dump() 関数を使ってファイル等に書き込むこともできます。

内包表記

内包表記は、 for 文で空のリストに要素を append していく処理を、1 行で書く書き方です。上のコードの result = [...] の部分は、次のループと同じ意味になります。

後ろに if を付けると、条件で絞り込むこともできます。

[...] を {...} に変えて key: value の形で書くと、辞書内包表記になります。

{...} の中に key: value ではなく単一の式を書くと、セット内包表記になり、重複を除いた集合が得られます。

丸括弧 (...) にするとジェネレータ式になります。要素を都度生成するので、全要素をメモリに載せずに sum や any に流すときに便利です。

内包表記は Python で頻繁に出てくる書き方なので、 for と if の並び順、括弧の種類ごとの意味を掴んでおくと、Claude が書くコードもすんなり読めるようになります。

ensure_ascii=False の意味

json.dumps はデフォルトで、非 ASCII 文字を \uXXXX 形式にエスケープします。たとえば {"name": "田中"} は {"name": "田中"} と出力されます。JSON 仕様上は正しいのですが、人間には読めません。
ensure_ascii=False を付けると、日本語がそのまま出力されるようになります。Claude が書くコードでは、日本語を扱うプロジェクトのときにこれが必ず付いていました。

パターン 2: 行番号でファイルを書き換える

sed -i でもできる処理ですが、複数行の書き換えを dict でまとめて記述したいときや、事前チェックを入れたいときには Python で書く方が確実です。
たとえば、Markdown の表の特定行の末尾に列を追記する処理です。

見どころは次のとおりです。

  • with open(...) as f:
    with 文で開いたファイルは、ブロックを抜けるときに自動的に閉じられます。例外が起きても閉じてくれるので、明示的な close() を書かなくて済みます。Python でファイルを扱うときの定番の書き方です。
  • encoding="utf-8" を明示する
    macOS や Linux ならデフォルトが UTF-8 のことが多いのですが、Windows や一部の環境では別のエンコーディングが使われる場合があります。日本語を含むファイルを扱うときは、 encoding="utf-8" を明示しておくと環境依存の事故を避けられます。
  • readlines() は改行を含む
    f.readlines() で返るリストの各要素は、末尾に \n を含んだままです。行末に追記する場合は、いったん rstrip("\n") で改行を除去し、追記後に + "\n" で戻します。
  • 行番号は 1-indexed で受け取り、 idx = ln - 1 で 0-indexed に
    エディタや grep -n が表示する行番号は 1 から始まりますが、Python のリストは 0 から始まります。人間が指定する値は 1-indexed で受け取り、内部で - 1 してから使うと、書き手にも読み手にも自然です。
  • assert で前提を明示する
    assert stripped.rstrip().endswith("|") は、書き換える行が表の行であることを事前に確認しています。想定外の行を書き換えるとファイルが壊れるので、前提が崩れたら止まるようにしておきます。ちょい仕事の Python コードでも、こうした最低限の防御は入れる価値があります。エラーメッセージには、次で説明する f-string を使っています。

f-string f”…”

Python の文字列リテラルには、先頭にプレフィックスを付ける書き方があります。よく使われるのが f-string で、 f"..." の形で書きます。中括弧 {} の中に変数や式を書くと、その値が埋め込まれた文字列になります。

{} の中には、変数だけでなく式も書けます。

数値のフォーマット指定は、 : の後ろに書きます。

さらに、 !r を付けると値の repr() が埋め込まれます。文字列のクォートや改行の見え方をそのまま残したいときに便利です。上のコード内で使った f"line {ln} not a table row: {stripped[:40]!r}" も、行の内容をそのままの見た目でエラーメッセージに含めるためのものです。

-c とヒアドキュメントの使い分け

-c は 1〜2 行の処理までが目安です。シェルの引用符の中に Python コードを書くため、複数行のインデントを含む処理は書きにくくなります。文の区切りは ; を使いますが、 if や for の直後には使えないので、単純な逐次処理に限定されます。
インデントが必要になったらヒアドキュメントに切り替えます。開始タグ PY と終了タグ PY の間に Python コードをそのまま複数行で書けます。

開始タグは 'PY' のようにシングルクォートで囲むのが定番です。囲まないと $var などがシェル側で展開されるため、Python コード側に $ や ` を含む場合の事故を防げます。

さいごに

これからも、Claude Codeが出力するPythonコードを理解できるようになるために、連載していきたいと思います。

おすすめ書籍

直感 LLM ―ハンズオンで動かして学ぶ大規模言語モデル入門 実践 LLMアプリケーション開発 ―プロトタイプを脱却し、実用的な実装に迫るための包括的な手引き LLM入門:しくみから学ぶ生成AIの基礎: “使うだけ”から卒業するための、易しいけど深く言語モデルを探求する本 (LLMマスターシリーズ)

blog-page_footer_336




blog-page_footer_336




-Tools

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA


関連記事

ToDoアプリ5選

デザインの個性が現れるToDoアプリ5選!!

ToDoアプリ はじめに こんにちはー!デザイナーのnottyです。 4月から新社会人として違う部署、転職などで新しい環境で働いている方が多いと思います。 私もその一人です。 やる事、新しい事が多く ...

Spec KitでSpec駆動開発をやってみる

はじめに Spec KitとGitHub Copilotを使って、ブラウザで動く簡単なToDoアプリをSpec駆動開発で作ってみました。 Spec駆動開発とは Spec駆動開発(Specificati ...

【Unity】Standard Assetsでエラーが出た時の対応

はじめに こんにちは、suzukiです。本日はunityのStandard AssetsをImportした際に、発生する。エラーの対処方法についてまとめました。 Standard Assetsのエラー ...

暗号資産(仮想通貨)の取引で損益が発生するパターン

はじめに 前回の記事で暗号資産を購入・売却した際の手数料について記事を書きましたが、 今回は確定申告に必要な損益が発生するケースを書いていこうと思います。 暗号資産を売却し、一定以上の利益が発生した場 ...

Gitの初期設定と便利な設定

はじめに 多くの方がGitでソース管理していると思いますが、マシンの新調などで環境設定が必要になった場合に何を設定すればいいか困ることがあると思います。 今回はGitの初期設定とそれ以外の便利な設定に ...

フォロー

blog-page_side_responsive

2026年7月
日 月 火 水 木 金 土
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。