はじめに
みずほリサーチ&テクノロジーズ株式会社の @fujine です。
2024/9/27-29に東京で開催されたPyConJP 2024に参加・登壇してきました。
遅ればせながら、本記事では私の発表内容と、他セッションで特に面白かったものを共有させていただきます。
私の発表
あなたのアプリケーションをレガシーコードにしないための実践Pytest入門
今年度はpytest
によるテスト事例を発表させていただきました。いくつかの開発案件にてpytest
を導入して得られたノウハウをまとめたものです。発表資料はMarp
で作成しました。
プログラムは通常、他のモジュール、実行環境、外部API、外部DBなど様々な要素に依存していることが多く、単体でのテストを難しくする要因となります。
これらの依存関係をどのように解消して単体テストできるようにするか、を具体的な事例を多数盛り込んで解説しました。
スライド後半にはテスト駆動開発(TDD
)のデモを加え、テストファーストな開発手法の有用性を紹介しました。
当日は多くの参加者にご聴講いただきました。この場を借りてお礼申し上げます。
以降の章では、私が特に面白いと感じたセッションを順不同で抜粋してご紹介します。
Day1
5年分のツケを一気に払った話
「ドキュメントが無い、テストも無い、開発者もいない」という三重苦なレガシーコードをいかに苦労して改善したか、のサクセスストーリーです。
パッケージ単体の互換性問題ならまだしも、パッケージ同士の依存関係が複雑だと問題解決がさらに困難になるため、セッションの苦労話はとても共感できました。
(最後のスライドで私の発表を少し宣伝していただけたようです。ありがとうございます!)
ORM と向き合う
便利だけとメンテが大変なORM、なぜ必要なのか、どうして辛いのか、他に方法は無いのか、といった疑問点を深掘りしています。
結構分かりやすいのに内容は深いです。全てをPythonだけで何とかしようとするのではなく、「必要な責務さえ果たせるならば他言語のサービスを組合せても良い」という発想の転換は大事だと思います。
「無慈悲なインピーダンスミスマッチ」はパワーワードですね笑
MLOpsの「あるある」課題の解決と、そのためのライブラリgokart
データ・特徴量・パラメータ値・モデルやパイプライン全体の管理って結構大変ですよね。Kaggle
などのコンペでも大量の試行錯誤を行うことが多いため、機械学習やるなら個人・チームを問わずMLOps
は重要な技術要素だと思います。
gokart
は初見でしたが結構簡単に使えそうな印象でした。これまでscikit-learn
のPipeline
やmlflow
を使ってましたが、gokart
も試してみようかな。
PythonのHTTPクライアントツール 徹底比較
requests
、httpx
、aiohttp
の比較セッションです。
requests
は昔からお世話になってますが、これからはrequests
をベースにしつつ非同期処理もサポートしているhttpx
への切替を検討してみます。
FastAPIでのasync defとdefの使い分け
「並行処理、並列処理、非同期処理は何がどう違うのか」がとても分かりやすかったです。
async/await
はまだまだ初心者ですが、今年からFastAPI
を勉強中なのでしっかり覚えていきたいです。
Day2
【招待講演】PythonのUTF-8化
CPythonコアデベロッパーの方による講演です。UTF-8
への移行にってこんなに大変だったんですね。
私の会社PCはずっとWindowsなので、CP932
エンコーディングに起因するエラーには何度も悩まされました...2026年のPython3.15が待ち遠しいです。
Pythonで 日本語処理 入門 〜フリガナプログラムを作ろう〜
SudachiPy
による日本語の形態素解析とフリガナ処理を学べるセッションです。日本語処理ではGiNZA
も有名ですが、内部の形態素解析ではSudachiPy
が使われています。
(私は昔janome
を愛用していたのですが、こうした言語処理は辞書の精度とボリュームが命なので、今はSudachiPy
推しです。)
初心者向けの分かりやすい内容なため、Pythonで言語処理を始めて学ぶ方の学習コンテンツにも適しています。
Streamlining Testing in a Large Python Codebase
ソースコードの増加に伴う自動テストの実行時間の増加をいかに削減するか、という内容です。マルチコアによる並列テスト、インストールパッケージのキャッシュ、テスト済みコードの再テストやカバレッジのスキップ、などが紹介されています。
ちなみにpytest
にも、--last-failed
や--failed-first
といった前回失敗したテストケースから再開するオプションがあります。
Skip Unnecessary Tests and Linters
の章ですが、モジュール同士に依存関係がある場合、変更していないプログラムのテストが失敗する可能性はあります。リグレッションテストを行うのであれば、一部をスキップせず全テストケースを実行するのが確実でしょう。
Pythonの数学機能を学ぼう! その仕組みも学ぼう!
普段何気なく使っているint
やfloat
がどのように実装されているのかをディープダイブできます。
- プログラミング言語によって、
n + 1 ≠ n
が保証されるかどうかは異なる -
-5〜256
以外の整数値は動的に生成される - 整数の精度に上限がない(メモリが許す限り表現できる)のはなぜか
-
int("1" * 4301)
はなぜエラーになるのか - Python3.13で追加される
FMA
とはどんな数学関数なのか
など、数値を扱う奥深さを体感することができ、驚きの連続でした。
「巨人の肩の上」で自作ライブラリを作る技術
自作ライブラリ開発のポイントを紹介しています。
いきなりプログラムを書き始めるのではなく、
- 既存の類似パッケージや文献を調査し、「車輪の再発明」を回避
- 泥臭い調査を経て、自作ライブラリの要件を精緻化
- 要件をテストケースに落とし込み、テストファーストに開発
という開発スタイルは、自作ライブラリに限らず通常のシステム開発でも大いに有益だと感じ、とても共感できました。
SQLModel入門 〜クエリと型〜
SQLModel
による型安全なモデル定義やクエリの実装ノウハウです。全体で116枚、おまけも含めると146枚のスライドは読み応えがあります!
FastAPI
とSQLAlchemy
を組み合わせることは多いので、SQLModel
で作ったモデルをそのままFastAPI
のレスポンスに使えるのは結構便利ですね。私もSQLModel
を使ってみたいと思います。
みなさんもCfPへの盛り込みすぎには気をつけましょう🥲
私もCfpに盛りすぎちゃってスライド作成が大変だった同志です。
Rustを活用したPythonライブラリの開発
Rust製Pythonパッケージの開発手法を紹介しています。近年はRuff
やPyDantic
など、Rust実装により高速化を図ったパッケージが増えてきましたね。
Rustは全く門外漢ですが、コードさえ書ければPythonへの組み込みは意外と難しくなさそうな印象でした。Python自体もFaster CPythonプロジェクトにより徐々に高速化されており、今後の更なる性能改善が期待されます。
データサイエンスのフルサイクル開発を実現する機械学習パイプライン
MLOps
の改善事例です。Luigi
→ Amazon SageMaker
→ Prefect
というワークフロー・パイプラインの変遷を通じて、当時の課題や解決方法の模索を追体験できます。
Python製ワークフローではAirflow
が真っ先に思い浮かびましたが、Prefect
も結構使いやすそうですね。
Airflow
はMWAA(AWS)
、Cloud Composer(Google Cloud)
、Azure Data Factory
など主要なプラットフォームにも統合されている点が強みですが、小規模な開発と運用であればPrefect
から始めてみるのもアリだなと思いました。
実践Dash - 手を抜きながら本気で作るデータApplicationの基本と応用
Dash
によるローコードな可視化ツール作成のセッションです。Steamlit
よりも(比較的)レイアウト変更が柔軟でデータ可視化に強い、のがDash
の特徴のようです。
どんなLow-codeでもちゃんとやろうとするとLowじゃなくなる
はまさに真理で、「要件やこだわりを思い切って削れる覚悟」が無いと追加機能がどんどん膨らんで結果的にハイコード開発になりがちだなぁと実感しています。
Pythonで3次元CGを作りたい人のためのPyVista入門
3DのCGを作成できるPyVista
の紹介です。基本的な形状のポリゴンやテクスチャマッピング、光源の設定など、代表的な処理ができるようです。3D開発って敷居が高いイメージでしたが、こんなに簡単にできるとは驚きでした。
Pythonと相互運用可能な静的型付け言語Erg
Pythonの欠点を補完することを目的とした新言語Erg
開発のプレゼンです。どのような言語にも何らかの欠点がある中、外部パッケージに頼るのではなく「新しい言語を開発する」というモチベーションは凄いと思います。
プロダクションでのPython非同期ユースケース - Trio/Trio-Utilを中心に
ロボットを自律制御するための非同期処理の開発事例です。
非同期処理=asyncio
と思いがちですが、あえて外部パッケージのTrio
を当時採用した理由やその効果が解説されています。「構造化された並行性(Structured Concurrency
)」という概念は勉強になりました。
ところでnursery
(保育園)ってAPI名はセンスありますね。
Getting Started with Open Source Contributions
オープンソースプロジェクトに貢献するための心構えやアドバイスについてのトークです。
- 初心者に優しく、活発で、自身の関心が強いプロジェクトを選ぶ
- まずはドキュメントの加筆・修正から始め、コントリビュートの手順を習得する
- イシューを眺め、自分が取り組めそうな課題を探したり、イシューにコメントする
- バグのレポートや修正を通じて、メンテナーとの対話を深める
- 自身のアイディアや機能追加を提案してみる
のように、難易度が低いものから徐々に取り組むことで、最初から大きな失敗をすることなく継続的にコントリビュートできそうです。
Be polite and patient in all interactions.
(あらゆるやり取りにおいて、礼儀正しく辛抱強くあること)
は特に大事なスタンスだと感じました。
pytestプラグインを開発してDRYに自動テストを書こう
複数のプロジェクトで共通的に使用するテスト用処理をプラグイン化した話です。
プラグイン開発と聞くと難易度が高そうですが、pytest
では意外と簡単に作れるんですね。プロジェクト数が増えてconftest.py
の管理が大変になってきたらやってみようと思いました。
まとめ
本記事では、PyConJP2024の発表スライドを紹介させていただきました。
次回のPyConJP2025は、2025/9/26-27に広島にて開催予定です。来年度のCfpにも応募予定ですので、また会場で発表できる日を楽しみにしております。