nikkie-ftnextの日記

イベントレポートや読書メモを発信

#新宿御苑dev でのPyodideネタLTを記事化:ブラウザで動く、flake8-kotohaのplaygroundを作りました

はじめに

Python使い、nikkieです。

新宿御苑.wasm #2025.2.28にて、PyodideネタでLTしました。
スライドを用意せずにやったので、発表した内容を簡単に書き留めておきます

目次

PyodideネタでLTしました

https://pyodide.org/en/stable/index.html#what-is-pyodide より

Pyodide is a port of CPython to WebAssembly/Emscripten.

CPythonをWasmにポートしたもの、という理解です。

作りたかったもの

GitHub ActionsのYAMLファイルのリンター actionlint のplaygroundです1

Pythonのリンター flake8(の自作プラグイン flake8-kotoha2)のplaygroundが作れるんじゃないかと思ったんですよね。

flake8-kotohaのplayground!

上記ツイートのリンクをクリックすると体験できます。
https://ftnext.github.io/pyodide-practice/kotoha-playground.html#ZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEl0ZXJhYmxlCgoKZGVmIHBsdXNfb25lX25nKG51bWJlcnM6IGxpc3RbaW50XSkgLT4gbGlzdFtpbnRdOgogICAgcmV0dXJuIFtuICsgMSBmb3IgbiBpbiBudW1iZXJzXQoKCmRlZiBwbHVzX29uZV9vayhudW1iZXJzOiBJdGVyYWJsZVtpbnRdKSAtPiBsaXN0W2ludF06CiAgICByZXR1cm4gW24gKyAxIGZvciBuIGluIG51bWJlcnNd

textareaが2つ。
上のtextareaには、リント対象のPythonコードが書かれます3
「Run」をクリックすると、下のtextarea(Output:)にはリント結果が出力されます。

Pyodideを使って、このplaygroundを実装しました!

flake8-kotoha playgroundを実現できたポイント

実現できたポイントは2つあったと考えています。

micropipでPyPIからインストール

1つはflake8-kotoha(や依存するflake8)のインストールです。
これはmicropipで可能でした。

flake8やflake8-kotohaはPythonのみで実装されているので、micropipでインストールできます。
ブラウザ上に簡単に環境構築できたので、新宿御苑.wasmのLTを締切に設定しました

flake8コマンドの出力をJavaScriptで受け取る

もう1つはflake8コマンドの出力を画面に出すところです。
Pyodideでprint()を含むPythonコードをrunPython()したときの標準出力の扱い(setStdout)を知り、実現できました。

発表後記

スケジュールがタイトだったため、実装は粗いです。
例えば、URLのハッシュ以降に含めるbase64エンコードしたソースコードの実装にはブラッシュアップの余地を残します(actionlintの実装を理解しきれず一部から始めました)

懇親会で話して印象に残ったのは、(flake8は下火なので)Ruffでも同様のplaygroundができるのかという質問。
RuffはRust実装のためにmicropipではインストールできないのではないかと思われます(ただし未検証)。
ですが、Rust実装ということはWasmにコンパイルできるわけで、なんらか手段はありそうに思います(要調査)

終わりに

Pyodideを使って、flake8-kotohaのplaygroundを実現できました。
actionlintのplaygroundは再現させたかったので、Pyodideで実現できて達成感!
ちょこちょこと細かいところを作り込んでいきます

主催のasukaさんをはじめ、発表者・参加者の皆さま、ありがとうございました!
また、BuySell Technologiesさん、素敵なオフィスを使わせていただき、ありがとうございます


  1. 2024年6月の #dena_lint_night で目撃しました
  2. 「引数の型ヒントをlistにしてはいけません」と指摘します
  3. actionlintのplaygroundをパクって、URLでこのコードが渡せています(詳細はまたの機会に)