2023年10月: CPythonコントリビュートのはじめかた¶
福田(@JunyaFff)です。 今月の「Python Monthly Topics」は、CPythonコントリビュート(貢献)のはじめかたという内容でお送りします。
はじめに¶
OSSへの貢献、とくに普段利用しているOSSにコントリビュートしたいという願望は多くの方にあるのではないでしょうか。わたし自身、OSSへのコントリビュートを実践するエンジニアに憧れを持っていますが、なかなか一歩を踏み出せていませんでした。そんな中、今年参加したEuroPython 2023というヨーロッパのPythonイベントのスプリント [1] で、はじめてCPythonへのコントリビュートの機会を得ました。内容はとても小さなドキュメントの修正でしたが、実際に経験できたことはとても嬉しかったです。「どうやったらいいの?」という方の参考になればと思い、体験談とコントリビュートの具体的な流れを紹介します。
 
CPythonへのPR¶
ご参考までに、わたしの小さなPRはこちらになります。
gh-106971: Docs: Add missing issue reference by jrfk · Pull Request #106992 · python/cpython
ドキュメントの充実と簡単なチャレンジから¶
Pythonは開発者向けドキュメントが非常に充実しています。少しでもOSSへのコミットをした経験がある方ならば、これらのドキュメントを読めばコントリビュートの流れがわかるようになっています。本記事では、どなたでもチャレンジできるように要点をまとめ、Issueの中でも「Easy」「good first issue」といったラベルのついている、取り組みやすい課題への挑戦の手助けを目指します。
本記事は、2023年10月現在の情報をもとに執筆しています。内容は変更される可能性がありますので、最新およびより詳細な情報は開発者向けドキュメントの「Python Developer’s Guide」をご参照ください。
CPythonへのコントリビュートのきっかけ¶
前述の通り、わたしはEuroPython 2023でのスプリントにて、はじめてCPythonへのコントリビュートを行いました。
EuroPython 2023では、さまざまなスプリントが実施されました。参加方法はとても簡単で今回の場合、スプリントの当日現地に行くだけでした。カンファレンスのチケットを持っていれば、誰でもスプリントに参加可能です。わたしは、「CPython Core (work on Python 3.13!) 」という、CPythonへのコントリビュートスプリントに参加しました。
他にも次のようなスプリントがありました。気になったものをいくつか紹介します。
- Typing PEPs 
- qutebrowser: A keyboard-driven, vim-like browser based on Python and Qt 
- Patito – A data modelling layer built on top of polars and pydantic 
- Pyodide 
スプリントの詳細については、EuroPython 2023のWebサイトを参照してください。
EuroPython 2023 Sprints | ep2023.europython.eu
スプリント会場は「Prague University of Economics and Business」という大学で行われました。広い大学でとても気持ちの良い、きれいな会場でした。
 
Photo by Braulio Lara / CC BY-NC-SA 4.0¶
CPythonへのコントリビュートの流れ¶
コントリビュートのおおよその流れは以下のとおりです。
- CPython環境の構築 
- 対応できそうな課題を探す 
- 対応・動作確認をする 
- コミットとPRの作成 
- ライセンスの承諾 
- レビューとマージ 
順に見ていきましょう。
CPython環境の構築¶
CPythonの開発環境を構築する方法はいくつかあります。今回は、Visual Studio Codeの拡張機能「Dev Containers」を利用してローカル環境を構築します。CPythonの開発環境を作る、というと大変そうなイメージがありますが、Dev Containersを利用することで簡単に環境構築ができます [2] [3] 。
筆者の環境と事前準備¶
スプリントでの筆者の環境は以下のとおりです。
- M2 MacBookAir macOS Ventura 13.4.1 
- Docker Desktop 4.19.0 
- Visual Studio Code - Visual Studio Code Dev Containers Extension 
 
- Git client 
筆者の環境はMacですが、Windows/Linuxでも同様の手順でCPythonの環境構築ができます。
DockerやVisual Studio Code、Visual Studio Codeの拡張機能であるDev Containersについては事前にインストールが必要です。それぞれの環境構築については、公式ドキュメントを参照してください。
また、CPythonはGitHubのリポジトリで管理されているため、GitHub アカウントが必要になります。
GitHubのCPythonリポジトリをforkする¶
CPythonでは、GitHubのリポジトリをforkして、自分のリポジトリにコピーしてから開発を行います。
- ブラウザで https://github.com/python/cpython を開く 
- 右上のForkボタンをクリックする 
- 自分のアカウントにforkする 
 
CPythonのfork¶
Forkについての詳細は、GitHubの公式ドキュメントをご参考ください。
ローカルにgit cloneして、upstreamを設定する¶
自分のローカルにcloneして、Visual Studio Codeで開きます。
<your-username> は自分のGitHubのユーザー名に置き換えてください。
$ git clone git@github.com:<your-username>/cpython.git
cloneしたリポジトリに移動して、upstreamを設定します。upstreamを設定しておくことで、forkしたリポジトリの更新をスムーズに取り込むことができ、常に最新の状態で開発を進められます。CPythonの開発は活発で、多くの人が更新を行なっています。自分の対応を行う前に、最新の状態にしておくためにupstreamを設定しておきましょう。
$ cd cpython
$ git remote add upstream git@github.com:python/cpython.git
$ git config --local branch.main.remote upstream
$ git remote set-url --push upstream git@github.com:<your-username>/cpython.git
git remote -v で設定を確認します。次のようになっていればOKです。
$ git remote -v
origin  git@github.com:<your-username>/cpython.git (fetch)
origin  git@github.com:<your-username>/cpython.git (push)
upstream        git@github.com:python/cpython.git (fetch)
upstream        git@github.com:<your-username>/cpython.git (push)
$ git config branch.main.remote
upstream
詳細については、以下の開発者向けガイドの「Setup and building」を参照してください。
- 開発者ガイド: Setup and building 
Dev Container を起動する¶
Dev Containerを起動し、ビルドができることを確認します。事前にDocker Desktopを起動しておいてください。
Visual Studio Codeでcloneしたリポジトリを開き、Dev Containerを起動します。
Dev Containerを起動するには、左下の「リモートウィンドウを開く」をクリックします。
 
リモートウィンドウを開きます ボタン¶
次に「Dev Containers: Open Workspace in Container...」を選択します。Dev Containerのビルドが始まり、コンテナー上でワークスペースを開きます。
 
起動後、Visual Studio Codeで「cpython[開発コンテナー]」と表示され、コンテナー上でワークスペースが開いていることを確認します。
 
CPythonとドキュメントのビルド テストの実行¶
Visual Studio Codeで起動したDev Containerにて、CPythonとドキュメントのビルド、テストの実行ができるか確認します。
本セクションで紹介した内容については、次の開発者ガイドを参照してください。
- コンパイルとビルドについて: Compile and build 
- テストについて: Running and writing tests 
- ドキュメントのビルドについて: Build using make / make.bat 
まずはじめに、CPythonのビルドを実行します。
ターミナルにて以下のコマンドを実行してください。 --with-pydebug オプションは、Pythonのビルド時にデバッグ情報と追加のランタイムチェックを有効にするためのものです。オプションの詳細については、公式ドキュメントを参照してください。 3. Configure — Python 3.13.0a0 ドキュメント
実行後、次のようなメッセージが表示されればOKです。
$ cd cpython
$ ./configure --with-pydebug
$ make -s -j2
...
Checked 107 modules (31 built-in, 75 shared, 1 n/a on linux-aarch64, 0 disabled, 0 missing, 0 failed on import)
make を実行しエラーが発生する場合には make clean を実行後、再度 configure と make を実行してみてください。筆者の環境では、 make clean を実行しないとエラーが発生する場合がありました。
次に python.exe を実行して、インタプリタが起動することを確認してください。
$ ./python.exe 
Python 3.13.0a0 (heads/main:eeb4e974d0, Oct  3 2023, 16:25:42) [Clang 15.0.7 (Fedora 15.0.7-2.fc37)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
続いて、テストを実行してみましょう。次のコマンドを実行します。
$ ./python.exe -m test
特定のモジュールのみテストを実行する場合には、次のようにします。
$ ./python.exe -m test -v test_asyncio
...
28 tests OK.
Total duration: 1 min 5 sec
Total tests: run=2,400 skipped=55
Total test files: run=30/30 skipped=2
Result: SUCCESS
[root@677de16698c3 cpython]# 
最後にドキュメントのビルドを確認します。ドキュメントの修正を行う場合には、必要です。
次のようなメッセージが表示されビルドが成功すればOKです。
$ cd doc
$ make html
...
build succeeded.
The HTML pages are in build/html.
Build finished. The HTML pages are in build/html.
ビルドされたHTMLファイル( cpython/Doc/build/html/index.html )を確認してみましょう。見慣れたドキュメントをブラウザで表示できます。
 
ローカルでビルドされたPythonドキュメント¶
これで開発環境が整いました。Dev Containerのおかげで、簡単に開発環境の構築ができました。
対応できそうな課題を探す¶
次に、対応できそうな課題を探します。課題はGitHubのIssuesで管理されています。検索は、GitHubの検索機能を利用します。まずはじめに、ラベルが "easy" のIssuesを見てみると良いでしょう。その中で、自分の興味のある分野、好きな機能などを探してみてください。
- CPythonリポジトリの label:easy のIssues Issues · python/cpython 
タイミングによっては、対応できそうな課題がなかなか見つからないかもしれません。EuroPythonのスプリントの中では、スプリントリーダーから参加者へ「Python Organizationの別のリポジトリのIssuesも見てみてはどうか」という紹介がありました。次のリンクは、Python Organizationのうち、ラベルが "easy", "good first issue", "help wanted" のものです。参考にしてみてください。本記事の環境構築と同様に、GitHubのリポジトリをforkして、自分のリポジトリにコピーしてから開発を行い対応できます。
- Python Organizationの "good first issue","help wanted" のIssues Issue search results 
対応・動作確認をする¶
修正したい課題を見つけたら、対応してみましょう。対応する時の注意点としては次のとおりです。
- Issue の内容をよく読む 
- Issue の内容に沿って、修正を行う 
- テストを実行して、修正が正しく動作することを確認する 
- ドキュメントの修正を行う場合には、ドキュメントのビルドを行い、修正が反映されていることを確認する 
修正していてわからないことがあれば、Issueにコメントを残してみましょう。他にもさまざまな方法で助けを求めることができます。Issueのコメントのほかに、メーリングリストや、Discordのチャンネルなどがあります。詳細については、開発者ガイドを参照してください。
コミットとPRの作成¶
良いコミットとは¶
CPythonでは良いコミットは以下の2点であるとされています。
- 1つのコミットで複数の修正を行わない 
- 修正と関係のないコードのレイアウトの修正を行わない 
またコミットメッセージの書き方として、Pythonの開発者ガイドの中で How to Write a Git Commit Message というブログ記事が紹介されています。
その中では次のように書くと良いとされています。抜粋して紹介します。
- タイトルと本文を空白行で区切る 
- タイトルは 50 文字まで 
- タイトルをピリオドで終わらせない 
1行目をタイトルとして概要を簡潔に書き、 $ git log --oneline で表示したときに読みやすいように心がけましょう。もちろん英語で書く必要があります。
コミットやコミットメッセージの詳細については、前述のブログや次の開発者ガイドを参照してください。
- 開発者ガイド: Making good commits 
良いPull Requestとは¶
CPythonでの良いPull Request(PR)とは以下のように記載があります。確実に受け入れられるように、これらの対応を行うと良いとされています。
- 適切なバージョンへの変更 - 一般的にはmainに行う 
- PEP 8/PEP 7へ従うこと 
- 下位互換性を考慮すること 
- 適切なテストが追加されていること 
- すべてのテストにパスしていること 
- ドキュメントが更新されていること 
またこれらをチェックするために、以下のコマンドが用意されています。確実に実行するようにしましょう。
$ make patchcheck
- 開発者ガイド: Making good PRs 
ライセンスの承諾¶
修正を行い、CPythonへのPRを出すと、ライセンスの承諾を要求するボットが自動でコメントします。
 
license-botのコメント¶
コントリビュートを行うためには、Contributor Agreements に同意する必要があります。
これはPythonを管理する非営利団体「PSF(Python Software Foundation)」の PSF Licenseに基づいたPythonで使用するコードのライセンスを許可するためのものです。
署名するには、ボットのコメントにあるリンクをクリックし、数ステップの操作が必要です。操作はとても簡単です。内容をよく読み、同意する場合には署名してください。クリックするだけで署名を行うことができ、即日完了します。署名すると、ボットのコメントに署名したことが表示されます。
詳細については、開発者ガイドを参照してください。
- 開発者ガイド: Licensing 
レビューとマージ¶
ここまでで、コミットとPRの作成ができました。最後にレビューとマージが必要です。
PRを出すと、CPythonのコア開発者がレビューを行います。レビューのコメントを受けて、修正を行いましょう。
マージまでは時間がかかる場合があります。気長に待ちましょう。わたしの場合は、PRを出してから、約1か月後にマージされました。
[コラム]スプリントの様子¶
CPythonのスプリントリーダーはCPython core developerであるŁukasz Langa氏と、Steering Council Memberの一人でありPython3.12のリリースマネージャーのPablo Galindo Salgado氏でした。
目の前で、CPython core developerが議論をしている様子を見ることができ、とても貴重な体験でした。
 
Photo by Braulio Lara / CC BY-NC-SA 4.0 議論中のCPythonコア開発者。左からŁukasz Langa氏、続いてPablo Galindo Salgado氏。さらに、PyConJP 2022のキーノートスピーカーであるMark Shannon氏が目の前に。¶
このスプリントでは、まずはじめにŁukasz Langa氏から「開発者向けドキュメントを見てやってみください」といった説明がありました。その後、参加者は自分の興味のある課題を探し、対応を行いました。参加者の多くの方は慣れている様子で、すでに自分で課題を持ってきている方もいました。慣れていないわたしは、同じスプリントに参加したカンファレンスで知り合った方に「どうやったらいいの?」とつまらない質問をたくさんしてしまいました。彼のおかげでコントリビュートできたといっても過言ではありません。とても感謝しています。
 
Photo by Braulio Lara / CC BY-NC-SA 4.0 写真手前のいい感じにボケているのがわたしです。¶
まとめ¶
本記事では、CPythonへのコントリビュートの流れを紹介しました。
参加したスプリントでコントリビュートの流れを体験できたのは、とても良い経験でした。今回わたしは課題を持って参加しませんでしたが、課題を持って参加されている方も多くいらっしゃいました。課題解決の議論を気軽に、CPythonのコア開発者(課題によっては実装者や仕様を決めた方である場合もある)と直接できるチャンスというのはなかなかないと思います。また「そのあたりの仕様は向こうの部屋にいる彼が詳しいよ」といった様子は、まるで1つのプロジェクトルームで「Python」という大きなプロジェクトに参画しているような感覚になりました。OSSであるPythonはひとりひとりの手にによって作られているのだという実感こそが代え難い経験だったように思います。
CPythonは、多くの人によって開発、利用されているOSSです。30年以上の歴史を経て、多くの人が気軽にコントリビュートできる環境が整っています。
開発環境構築の容易さ、開発者向けドキュメントの充実、また問題解決のための助けを求めることができるコミュニティの存在など、コントリビュートしやすい環境が整っています。
すぐにコントリビュートできる課題に出会えないかもしれませんが、気長に探してみてください。
また、10月26日(木)から10月29日(日)に行われるPyConAPAC 2023でもスプリントがあるようです。興味の湧いた方はぜひこちらもご覧ください。