IndentationError を直している累計
INTERACTIVE INDICTMENT
Python がいかに非生産的で、人間を苦しめ、 AI を無駄にし、世界の敵であるか
これはチュートリアルではない。書く快感の裏で積み上がる運用税、壊れた空白、 嘘のパッケージ名、ログに沈黙する失敗、そして空転する知能—— それらを手で壊し、測り、告発するための博物館です。
ログだけ渡してトンチンカンを生成
import 名と配布名が一致しない件数
専用ツールを開くたびに減少
EXHIBIT 01
インデント罠 — 空白がセマンティクス
括弧を捨て、見えない空白に構造を預けた設計。多くのフロントエンド・メール・コピー経路は その空白を「意味のないゴミ」として破壊します。
構造破壊度
0%
構造はまだ保たれている
EXHIBIT 02
書く快感 vs 運用税
「書く瞬間の快感」のために設計され、その快感を最大化する方向へ破壊的変更が繰り返される。 快感スライダーを動かして、10年後のコスト曲線を観察してください。
書く快感を最大化するほど、後年の運用税と AI 浪費が指数的に膨らむ。
EXHIBIT 03
依存地獄 — 名前すら嘘
インストール名と import 名が違う。同一ライブラリの複数バージョンは同居できない。 後方互換を語りながら、解決不能な依存グラフを量産する。
7
- pillow→ PIL
- opencv-python→ cv2
- PyYAML→ yaml
- beautifulsoup4→ bs4
- scikit-learn→ sklearn
2
表面的には動いている。名前の嘘は既に仕込まれている。
EXHIBIT 04
AI 浪費シミュレータ
ログを見てもどこが壊れたかわからない。ソースを渡しても無限ループでさらに壊す。 最先端モデルに投げても制限に吸い込まれ、知能そのものが無駄になる。
ボタンを押すと、Python の失敗モードがいかに外部知能を空転させるかを再現します。
EXHIBIT 05
専用ツール群 — なければ不明、あっても狂気
言語が自分の構造を人間に直接見せることをやめた結果、理解の窓口がツールに外部化された。 ツールは増え、置き換わり、互いに相容れない。
pip
入れたつもり
venv
隔離したつもり
virtualenv
別の隔離
pyenv
本体の版
EXHIBIT 06
可変デフォルト引数 — 定義時に一度だけ
「書くのが短い」ために、デフォルト値が関数定義時に一度だけ評価される。 その結果、list / dict が呼び出しをまたいで共有され、見た目と意味が乖離する。 熟練者ですら踏み抜く、言語仕様のフットガン。
共有 list の長さ
0
問題のコード
def append_item(item, lst=[]): # 定義時に list が1回だけ生成
lst.append(item)
return lst
append_item("a") # ['a']
append_item("b") # ['a', 'b'] ← 別呼び出しなのに共有
append_item("c") # ['a', 'b', 'c']呼び出しログ(戻り値)
「呼ぶ」を押すたびに、Python が返す list をここに積みます。 罠モードでは、別呼び出しなのに中身が残ります。
EXHIBIT 07
GIL — 並列性の虚偽広告
CPython の Global Interpreter Lock は、同時に Python バイトコードを実行できるスレッドを 実質1本に制限する。スレッドを4本にしても、CPU バウンドな仕事はほぼ1コアで順番待ち。 「並列」と書いて「直列」と読む。
経過時間
0.00s
スレッド進捗
- Thread-10%
- Thread-20%
- Thread-30%
- Thread-40%
GIL 下では純粋 Python の CPU 仕事が Core 0 に集中。他コアは暇。
3.13〜3.14 で free-threaded ビルドが現実味を帯びても、生態系(拡張モジュール・慣習・デプロイ)が 追いつくまで「スレッド=並列」という広告は嘘のままだった。何十年分のワークアラウンド税は戻ってこない。
EXHIBIT 08
例外の沈黙
EAFP の裏側。夜間バッチは緑のまま終わる。壊れたのは単価で、届いたのは請求書。 例外を握ると、人間にも AI にも「どこが壊れたか」が残らない。
沈黙度
—
try:
recalculate_price(sku)
except Exception:
pass
send_invoice(sku) # 昨日の単価のまま方針を選んでバッチを回すと、緑の完了と実際の損害が並びます。
EXHIBIT 09
型は飾りである
注釈は関数の辞書に入るだけで、呼び出しは止めない。静的チェックは別プロセス。 実行結果は注釈の戻り値と食い違うことがある。
注釈の無力さ
—
def charge(user_id: int, amount: float) -> dict[str, int]:
return user_id + amount # 注釈はここを見ない
charge(42, 19.5)引数を選んで呼び出すと、注釈と実行結果のズレが出ます。
EXHIBIT 10
2→3 強制移住
後方非互換を一度に配り、業界に移行税を請求した。2to3 は括弧を足す。 割り算の意味が変わるところは、緑のテストのまま残る。
移行税
0.0人年
残件 6
赤はまだ Python 2緑は直した差分
def settle(items, total):
print "tax", total
for i in xrange(len(items)):
try:
total += items.keys()[0] / 2
except ValueError, e:
print(e)
name = "請求"
if isinstance(name, unicode):
print(name)
return totalprint 文
2to3 対象print "tax", total
SyntaxError: Missing parentheses in call to 'print'
xrange
2to3 対象xrange(len(items))
NameError: name 'xrange' is not defined
except E, e
2to3 対象except ValueError, e:
SyntaxError: invalid syntax
unicode 型
手作業isinstance(name, unicode)
NameError: name 'unicode' is not defined
dict.keys()[0]
手作業items.keys()[0]
TypeError: 'dict_keys' object is not subscriptable
整数の /
手作業/ 2 # Python 2 では 2
5 / 2 が 2 ではなく 2.5。テストは緑のまま金額が変わる
EXHIBIT 11
プロトタイプが本番になる
書き始めの速さで採用される。書き換えコストは後年から請求される。 出口は、入ったときにはもう見積の中にある。
閉じ込め度
0%
書き直し 0.5 日
rows = open("in.csv").read().split("\n")
print rows[0].split(",")[0]金曜の夜
動いた。共有したくなる速さがある。
テストはない。仕様は作者の頭の中だけ。
30 行 · 書き直し見積 0.5 日
FINAL VERDICT
告発の確定
展示と設計思想調査に基づく 14 件の罪状。 チェックを外して「弁護」してみても、構造は残る。
有罪確度
100%
14 / 14 認定
判決: 書くのが楽しいだけのカス言語。ただしその楽しさは、他者の時間と AI の知能を燃料にしている。
GUEST BOOK
来館者掲示板
アカウント連携後に書き込めます。Python への告発・共感・反論を残してください。