Auto-formatters for Python

in Project, Python, Tech

VSCode တွင် Python Code Formatting စမ်းသပ်ခြင်း

Python Code Formatter tool တွေအကြောင်း (Black , Ruff, etc) ဖတ်ဖူးတာ ကြာပီဆိုပေမယ့် vscode မှာ setup မလုပ်ဖြစ်ဘူး။ ဒီမနက် အစောကြီး နိုးနေတာနဲ့ computer ရှေ့ ထိုင်ရင်း လျှောက်စမ်းရင်း တော်တော်ကြာသွားတယ်။ အကြောင်းရင်းက vscode မှာ သွင်းထားမိတဲ့ pylance က အနီရဲရဲ error message တွေကို ကြာလာတော့ မြင်ရတာအဆင်မပြေတာကြောင့် ရယ် ၊ နောက်ပီး ကျောင်း project မှာ Guide ဆရာ က အဲဒီ equal sign = ရှေ့ space ဖြုတ်ဖို့ ခနခန ပြောလွန်းတာရယ်ကြောင့် အဲဒါကိုလဲ code formatting ထဲမှာ ရှိမှာပဲ ဆိုတာကနေ စလုပ်မိတာ။ (Assignment မပြခင် Code Formatting လုပ်လိုက်လေ လို့ စ အကြံဥာဏ်ပေးလိုက်တဲ့ Putuuu lay ကိုလဲ ဒီနေရာက credit ပေးပါတယ် 😀 )

Installation

pip install နဲ့ပဲ လွယ်လွယ်ကူကူသွင်းလို့ ရတယ်။ ဒါပေမယ့် အမှန်က မလိုလောက်ဘူး ။ VScode extension ကနေ Black formatter (or) Ruff ရှာသွင်းရင် အဲဒီ description မှာ extension နဲ့ အတူ သွင်းပေးထားတဲ့ version တစ်ခု ပါတယ်လို့ ဆိုထားတယ်။ ဒါပေမယ့် ကျွန်တော်က command line (vscode မဟုတ်တဲ့ အခြားအပြင်ဘက်နေရာတွေမှာပါ) လျှောက်စမ်းချင်တာနဲ့ pip install black (or) pip install ruff နဲ့ သွင်းလိုက်တယ်။

Black Formatter

ဒီကောင်က နာမည်ကြီးတာရော ၊ နောက်ပြီး vscode ထဲမှာ miscrosoft ရဲ့ official extenstion အနေနဲ့ ရှိနေတာရောကြောင့် အရင် စမ်းဖြစ်လိုက်တာ။ vscode ရဲ့ setting.json ထဲမှာ နဲနဲသွားပြင်ရုံပါပဲ။ (vscode setting.json ထဲသွားရန် >> Command Palette > Open User Setting (JSON)) ။ အဲဒီ json အတွင်းထဲမှာ extension description မှာ ပြောထားတဲ့ setting တွေ ထည့်ရုံပါပဲ။

"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true

Black Formatter မှာက အခြား custom setting တွေ လုပ်လို့ရတယ် ပြောပေမယ့် ကိုယ်ပဲ အရမ်းနားမလည်လို့လား မသိဘူး ။ ရှာမတွေ့ / မလုပ်တတ်ဘူး။ Documentation ကလဲ Ruff နဲ့ ယှဥ်မယ် ဆိုရင် သိပ်မပြည့်စုံဘူး။

Ruff

သူကတော့ microsoft က ထုတ်တာမဟုတ်ပေမယ့် Rust Programming Language နဲ့ ရေးထားလို့ အတော်မြန်တယ်လို့တော့ ကြားဖူးထားပြီးသား။ documentation တော့ တော်တော်ပြည့်စုံတယ် ပြောရမယ်။ Black ကနေ Ruff ကို ပြောင်းဖြစ်သွားတာက အခု ကျွန်တော်လိုချင်တဲ့ Removing White space code formatting ဆိုပြီး google မှာ ရှာတော့ Ruff မှာ custom ထည့်လို့ ရတဲ့ Rules တွေအကြောင်း သွားတွေ့တာ။ အဲဒီမှာ ကျွန်တော်လိုချင်နေတာက E251 ဆိုတဲ့ rule။ ဒါပေမယ့် Ruff documentation ထဲမှာ ရေးထားသလို အဲဒီ rule က Preview အနေနဲ့ပဲ ဖြစ်နေတယ်။ အဲဒီတော့ သူတို့ လမ်းညွှန်ထားသလို –

  • Root Folder အောက်မှာ pyproject.toml ဆိုတဲ့ file တစ်ခု အသစ်ဆောက်လိုက်တယ်။
  • အဲဒီ file ထဲမှာ အောက်က အတိုင်း ရေးထည့်ရတယ်။
[tool.ruff]
line-length = 100
[tool.ruff.lint]
preview = true
extend-select = ["E251"]

extend-select list ထဲမှာ ကိုယ် လိုချင်တဲ့ rule တွေ ထည့်ပေါ့ ။ Rule တွေ သီးသန့် ဖြစ်ချင်တယ် ဆိုရင် နောက်တကြောင်း ထပ်ထည့်လို့ ရတယ်။

explicit-preview-rules = true

အပြည့်အစုံက Ruff ရဲ့ Preview section အောက်မှာ သွားဖတ်လို့ ရတယ်။

ကိုယ် စမ်းသပ်ချင်တဲ့ code file ရဲ့ formatting ကို command line ကနေ လဲ လှမ်းစမ်းလို့ ရတယ်

ruff check **filename_that_you_want_to_test.py

Ruff ကို default code formatter အနေနဲ့ သုံးဖို့ ဆိုရင် Black တုန်းကလိုပဲ VScode ရဲ့ setting.json ထဲမှာ သွားပြင်ပေးဖို့လိုတယ်။

"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true

FormatOnSave ကတော့ ကျွန်တော်က file ကို save လုပ်တာနဲ့ auto format လုပ်ပေးသွားတာက သဘောကျလို့ true လုပ်ထားတာ။ အကယ်၍ ကိုယ်က မလိုချင်ဘူးဆိုရင်တော့ အဲဒါကို ဖြုတ်ပြီး Manual လုပ်လဲ ရတယ်။

Autopep8

ဒီအတိုင်း vscode extension ထဲမှာ တွေ့လို့ install လုပ်ပီး စမ်းမိတာ ။ အပေါ်က ၂ ခုလောက်တောင် သိပ်အဆင်မပြေပါဘူး။

Decision

လောလောဆယ်အနေနဲ့ Ruff ကိုပဲ ဆက်သုံးဖြစ်မယ် ထင်တယ်။ custom rules တွေ လွယ်လွယ် စိတ်ကြိုက်ထည့်လို့ရတာရယ် ၊ တစ်ခုခု ဆိုရင် documentation သွားဖတ်ရုံနဲ့ အဖြေရတာရယ်ကြောင့် အဓိက ရွေးဖြစ်တာ။ Black မှာလဲ သူ့အားသာချက်တွေတော့ ရှိနိုင်ပါတယ်။