世界を動かす技術を、日本語で。

なぜ私はhttpxをフォークしたのか

概要

  • httpxのフォーク「httpxyz」を作成した理由と背景
  • メンテナンスやリリースの停滞、GitHub上での運営方針の問題点を指摘
  • フォークの方針は「安定性重視」「大きな変更なし」
  • Codebergへの移行理由や今後のサポート体制について説明
  • 他の選択肢や移行の必要性についてもアドバイス

httpxをフォークした理由

  • httpx はPython向けの人気HTTPクライアントライブラリ
  • 2024年に zstdコンテンツデコーディング 機能をコントリビュートし、マージ・リリースされた実績
  • しかし、その機能に不具合が見つかり、 修正を提案 したが無視され、2024年11月以降リリースも停止
  • 自分や他のユーザーが 修正版のリリース を何度も要望
  • 作者に直接メールしたが、「1.0開発中」とのみ返答
  • 1.0リリースの計画 は2年以上前から続くが進捗が遅い
  • パッチレベルのリリース (0.28.2)も1年以上ドラフト状態

GitHub運営上の問題

  • イシューが非公開化 され、ディスカッションも停止
  • イシュー非公開により、コントリビューションや利用者の問題解決が困難化
  • redditスレッド でも議論が発生
  • 1.0リリースが数年越しの話題になっており、将来的な大幅変更の可能性も指摘
  • Simon Willisonによる 慎重な意見 も参照推奨
  • openaiやanthropicのPythonパッケージ もpyproject.tomlで1.0をインストールしないようガード
  • マイナーアップデートで破壊的変更 を加えることがあり、多くのユーザーに負担
  • 作者は Django REST frameworkMkDocs の作者でもあり、同様にイシューやディスカッションを停止した前例

フォーク決断の理由

  • これらの状況から、 httpxに依存するユーザーのため安定したフォーク が必要と判断
  • メンテナーバーンアウトや“次”への集中も理解しつつ、 メンテナンス放棄と他者の参加拒否 は問題視
  • 作者へのリスペクトと今後の活躍への期待も表明

FAQ

  • Q: なぜフォークしたのか?
    • 上記の理由すべてが動機
  • Q: 今後の方針は?
    • httpxの安定フォークとして 大規模な書き換えや破壊的変更は行わない
    • モットーは「 少しだけ速く、壊さずに進む
  • Q: 負担が大きくて自分も燃え尽きないか?
    • httpxは2024年以降リリースがなく、 もう少し頻繁なリリース が目標
    • Sander Wegter が共同メンテナーとして負担分散
  • Q: なぜCodebergに移行したのか?
    • GitHub依存の単一文化 への懸念
    • Codebergは 非営利運営、FOSDEMで運営者と交流した好印象
    • リポジトリは こちら (リンク省略)
  • Q: 今すぐ自分のコードを移行すべきか?
    • 必要があれば歓迎だが、現状問題なければ 無理に移行しなくても良い
    • 他のパッケージへの移行も選択肢
      • niquests はrequestsのフォークでHTTP/2, HTTP/3, async対応
      • requests APIに近いため、httpxからの移行も比較的容易
  • Q: プラグイン互換性は?
    • import httpxyz as httpxで多くは動作するが、 一部プラグインや拡張機能は要調整
    • 今後の対応を観察予定

終わりに

  • Hacker News での議論も参照推奨
  • 参加・利用への感謝と「楽しんで!」のメッセージ

Hackerたちの意見

なんかhttpxとhtmlxを混同しちゃった。

同じく!君のコメントのおかげでやっと気づいたよ。

あと、htmlxとhtmxも混同してるのかな?

あ、htmxのことを言ってるんだね。私も同じだよ。しばらくその記事を読んでたけど、「HTTPXはPython用の非常に人気のあるHTTPクライアントです。」って言葉に混乱して、「なんでOpenAIはhtmxを使ってるの?」って思ってたけど、最終的に何が起こってるのか気づいたよ。

私もこの記事をずっと間違って読んでたわ。

最近のPythonのhttp周りはちょっと怖いよね。フォークするんじゃなくて、力を合わせてほしいな… Niquests見てみて。https://github.com/jawah/niquests 俺は見たことを解決しようとしてるんだ。何年も頑張ってきたから。

確認済み、機能も増えて、切り替えも楽だよ。

httpxの基盤はあんまり良くないと思う。最初にPythonのrequestsをasyncに対応させた「ポート」だから成功したんだろうけど、それ以外はイマイチ。APIもパフォーマンスも微妙だし、調整も大変。メンテナの考え方もあんまり良くない。最後のポイントについては、記事でいくつか言及されてたけど、理由もなく突然プロダクションプロジェクトが壊れることもあるからね。完璧じゃないけど、みんなAiohttpに切り替えることをおすすめするよ。

確かにniquestsがもっと使われてないのは残念だよね。フランス語の(c'est Français)の議論を使おうとしたら、初期のユーザーをたくさん集められると思うよ。

それって「knee-quests」それとも「nigh-quests」?最近、こういう絵文字付きのコミットをよく見るようになったけど、変わってるね。

ありがとう、君のプロジェクトにリンクするね。

半端なサイドプロジェクトはPyPIを汚すだけだから、思い切ってフォークを作ってそのトレードオフを受け入れた方が、長期的には楽だよ。

まだTrioのサポートはないよね?少なくとも僕にとっては、httpxを使う主な理由だし、数年前に「import httpx」って打った時からずっとそうだよ。(それに、READMEのスポンサーシップのことがなんか怪しい感じがする。もしかしたら、僕があまりにも痛い目にあったからかも—一般的にサポートを売ることを否定するつもりはないけど。)

うちの会社ではniquestsに切り替えたんだけど、はい、httpxより10倍いいって言えるよ :)

Hacker Newsのディスカッションのリンクは「https://news.ycombinator.com/item?id=47514603」にすべきだと思う。「news.ycombinator.com/item?id=47514603」じゃなくて。

もっと関連したドラマ: MkDocsのスロークラッシュ (https://fpgmaas.com/blog/collapse-of-mkdocs/)

あ、関わってる人の一人をすぐに認識したよ、ドラマ好きな人だね。でも、mkdocsパッケージをハイジャックするのは間違ったやり方だと思う。FOSSの世界はフォーク恐怖症になりすぎてるよ。mkdocsをフォークして、自分の好きなように進めればいいのに。

Read the DocsがMkDocsから利益を得て、何も返さないことを批判するスレッド。 > ソースコードを開放しないのはオープンソースソフトウェア開発の原則に反するって指摘もあるね。こういう感情を持ってる人がBSDライセンス(このプロジェクト)を選ぶのを見ると、いつも面白いと思う。もしそういう行動を抑制する文化が欲しいなら、どうしてそれを明示的に許可するライセンスを選ぶの?強制できるかどうかに関わらず、そのライセンスは基本的に、あなたが持ちたいコミュニティのタイプを示すCoCの一種だよ。

もしこれがテレビ番組だったら、たぶん見ると思うけど、なんてドラマなんだ。

一方で、そのプロジェクト乗っ取りの話はJia Tanっぽい匂いがする。もう一方では、MkDocsの作者が言ってる性別に関する不満のコメントがめちゃくちゃで、彼らが作ったものには絶対触れたくないな。

フォークおめでとう!オープンソースは作者から世界への贈り物だから、作者は誰にも何も義務を負ってないことを忘れないでね。だから、何らかの理由で上流に行けない機能が必要なら、フォークするのが唯一の現実的な選択肢だよ。うまくいくといいね!

これは単なるオープンソースじゃなくて、HTTPリクエストにおけるXKCD 2347的な基盤的役割を持つ巨大なパッケージエコシステムに参加することだよ。サイドプロジェクトを個人のホームページに載せて放置するのはいいけど、中央インフラにするなら、参加者に応じたり、拡張したり、メンテナンス権を譲ったりしないとね。

Visitor 4209 since we started counting その小さなディテール、いいね!昔のインターネットを思い出す :)

さっき見たときは45だったのに、今は261になってる。

Pythonって、なんで開発者が分断をそんなに好むんだろう?HTTPリクエストを送るのは現代の基本的な能力なのに、標準ライブラリにはフレンドリーで、機能満載で、バトルテスト済みの非同期対応クライアントが含まれてるべきだよね。でもPythonの標準ライブラリには醜いurllib.requestしかなくて、みんなrequestsやhttpxみたいなサードパーティのものを使ってるけど、それもいつもちゃんとメンテされてるわけじゃないし。(パッケージングについても参照)

そしたら壊れてることが分かったんだ。修正を提案したけど、無視されて、それ以来2024年11月からリリースもない。これってフォークする理由としてはかなりいいと思う。 > HTTPリクエストを送るのは現代では基本的な機能だし、標準ライブラリには使いやすくて、機能満載で、実績のある非同期対応のクライアントが含まれるべきだよね。でもPythonにはないし、JavaScript(まあNodeも)、Golang(http/netはurllibよりもひどいと思う)、Rust、Java(UrlRequestはPythonと同じ)、それに.NETのHttpClientも…まあまあって感じ。正直、リクエストが標準化されて標準ライブラリに組み込まれてないのはいつも驚きだわ。

HTTPリクエストを送るのが基本的な機能だと思うかもしれないけど、いろんな言語でやってみると面白いよ。ずっと前(2020年、見方によってはそんなに昔じゃないけど)、依存関係なしでNodeでHTTPリクエストをするのがちょっと面倒だなって驚いたことがある。以下のコードみたいにね:const response = await new Promise( (resolve, reject) => { const req = https.request(url, { }, res => { let body = ""; res.on("data", data => { body += data; }); res.on('end', () => { resolve(body); }); }); req.end(); });

HTTPクライアントは「必要なソフトウェアのビルディングブロック」と「RFC 2616の実装が難しい細かい部分」の交差点にある。実際、Pythonとはあまり関係ないよ。

みんな「フレンドリー」と「フル機能」をどう定義するかは違うからね。悪いソフトウェアを神格化しないためにも、標準ライブラリはできるだけミニマルに保った方がいいと思う。プログラミング言語には、その時々の一般的に使われる「ベストプラクティス」のライブラリを含む「標準ディストリビューション」を用意することもできるかもしれない。

これはPython特有の問題じゃなくて、人間特有の問題だよ。Pythonが人気だから、Pythonパッケージでより頻繁に、より公に起こるだけなんだ。

ブラムの法則: Pythonはすべてを簡単にしてくれるね。

「HTTPリクエストを送るのは現代の基本的な能力で、標準ライブラリには使いやすくて、機能が充実していて、テスト済みの非同期クライアントが含まれるべきだ。」多くの言語が標準ライブラリでHTTPに苦労しているのを見てきたけど、他の部分が素晴らしくてもそうなんだよね。「使いやすさ」と「すべてのユースケースをカバーすること」のバランスを取るのが難しいと思う。ほとんどの言語は後者に偏りがちだけど、それも理解できる。

Pythonのメンテナーたちは、昔の「バッテリー付き」アプローチの影響でまだ焼けた感じが残ってるんじゃないかな。

私の見たところ、良い標準HTTPライブラリがないのは人気のある言語では普通みたい。Python、Ruby、Rustなど、どれもパッとしない標準ライブラリか、そもそもライブラリがないかだと思う。多くの言語は、必要なRFCや暗黙のRFCがたくさんあって、リクエストを作るための異なるイディオムもたくさんあって、何をサポートするかの線引きも難しいから、決定圧力が多すぎるんだよね。例外的なのはGoで、素晴らしいライブラリがあるけど、Goは全体的に素晴らしい標準ライブラリを持ってることで有名だよね。

httpxは非同期サポートがあるけど(aiohttpみたいに)、urllibはブロッキング専用なんだ。N個の同時リクエストが必要な場合、urllibはNスレッドかプロセスが必要になるよ。

ブログ記事からのいい一言・・・「じゃあ、今の計画は?」 - 「もう少し早く動いて、物を壊さないように」

Pythonの標準ライブラリにしっかりメンテナンスされた非同期HTTPクライアントがないのは、ずっと痛いポイントだったね。誰かが自分でやるのも納得だわ。

標準ライブラリに非同期HTTPクライアントがあれば、pipのようなツールにも良い影響があるだろうね。もっと非同期の処理をすることで、uvがずっと速くなる理由の一つでもあるんだ。

これはmodshimの理想的な使い方に思えるね。上流に貢献するのが理想だけど、メンテナーがいろんな理由で貢献をマージするのが遅いこともあるから、貢献のギャップを埋めるのが目的の一つなんだ。フォークしちゃうと、恒久的な分裂が生まれて、ちょっとした変更でもメンテナンスが大変になるよね。modshimを使えば、自分のバグを直すためだけの新しいPythonパッケージを作れるし、上流のhttpxから他の部分を自動的に引き継げるんだ。

modshimはお金のパッチを当てるわけじゃなくて、パッケージの外部APIをラップしているだけみたいだけど、もし変更がパッケージの内部に深く入っているなら、ほとんどのパッケージを外から再実装することにならない?