nikkie-ftnextの日記

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

「Reformating your code without AI」のスライドから、フォーマッタが+演算子の前後に半角スペースを1つずつ入れられる仕組みを完全に理解しました。LibCST、すげ〜 #pyconapac

はじめに

今日の羽生さんの勝利には震えました。nikkieです

フォーマッタ(例:Black)って毎日お世話になってます1が、すごくないですか?
どんな仕組みで動いたらあんな風にフォーマットできるのか、私は皆目見当もつきません!
そんなフォーマッタの仕組みを覗けちゃうトークがPyCon APAC 2023にありました。

目次

トーク「Reformating your code without AI - let's see how a formatter work」

Cheuk Ting Hoさんによるトークです。
https://2023-apac.pycon.jp/timetable?id=EFRGJM

発表資料

こちらのスライドを追いました(アーカイブ視聴はまたの機会に)

フォーマッタはどのように動作するのか

3章構成でした。

  1. Pythonコードの解析
  2. フォーマット対象のコードパターンとのマッチ
  3. Pythonコードを書き直す(=フォーマット)

Pythonコードの解析

AST(抽象構文木)から話が始まります。
これは私が興味を持っているトピックでもあります2

フォーマッタは半角スペースなどを扱いますが、抽象構文木には半角スペースが含まれません。
そこで具象構文木(CST)を扱います。
具象構文木を扱うライブラリがLibCST!

Instagramが開発してるんですね。

コードパターンとのマッチ

Matcher3とVisitorという2つの概念が紹介されます。

+演算子を扱うVisitorの例

  • Visitorを定義(cst.CSTVisitorを継承したクラス)
  • 2つのメソッド visit_Add / leave_Add を定義

% python visitor_example.py
counting Add number 1

counting Add number 5

nodeを出力してみたところ、+演算子と前後のwhitespaceが木構造で示されていました!

counting Add number 1
Add(
    whitespace_before=SimpleWhitespace(
        value=' ',
    ),
    whitespace_after=SimpleWhitespace(
        value=' ',
    ),
)

Pythonコードを書き直す

Visitorはread onlyなので、writeもできるTransformerを使います。
Visitor同様に継承し、visit_Add / leave_Add を定義します

スライドを離れますが、Visitorでのprint出力を見たことから、「visit/leaveのどちらかで、+前後のwhitespaceを常に1個になるようにupdateしちゃえばいいのでは」と思ったんですよね

% python transformer_example.py
1 + 2 + 3
4 + 5
6 + 7
print("ham" + "egg+")

フォーマットできた!!
Blackはこういう仕組みで動いてるってことか〜

終わりに

Cheuk Ting Hoさんによるトーク「Reformating your code without AI」のスライドを元にLibCSTを触りました。

LibCST、めちゃめちゃ便利ですね。
半角スペースまで含んだ木構造なのがとってもありがたい!

「Blackの実装って、私の理解が及ばない深淵なことをやってるんだろうなあ」と勝手に神格化してましたが、LibCSTを知ったことで「読めそう」「理解できそう」と思えています。
こういう技術的な出会いもあるから、カンファレンスっていいですよね

Thank you for your presentation👏👏

P.S. Cheuk Ting Hoさんは11/15(水)のみんなのPython勉強会でも話していただきます!

11月のみんなのPython勉強会はGlobal Meetup!
"Looking back PyCon APAC 2023"(PyCon APAC 2023 ふりかえり)

15日水曜日 19時からオンライン開催!

スピーカーは

  • Cheuk Ting Hoさん『Python security and you(Pythonのセキュリティとあなた)』
  • Yung-Yu Chenさん『PyCon, Taiwan, APAC, and scientific programming』

日本語への逐次通訳があるのでご安心ください。

司会が概略を日本語に訳して視聴者にお届けします。

私もGPTの力を解き放つぞ〜(5月以来のチャットサポート)

LT(日本語)も3本あります!(お申し込みありがとうございます)

「気になってきた〜」という方、Global Meetupでお会いしましょう!


  1. blackの実行結果を見た回数 >> 親の顔を見た回数 成り立っちゃうかもな
  2. 関連してPEGも面白いですよ!
  3. 抹茶!(私の心の中のエミリーちゃんの反応です。かわいいですね)