Ruff: Linter & Formatter Python เร็วกว่า 100 เท่า!

Ruff: linter + formatter Python ตัวเดียวแทน flake8+black+isort เร็วกว่า 100 เท่า ตั้งค่าใน 5 นาที

ผมเคยเจอสถานการณ์แบบนี้บ่อยๆ ในทีมพัฒนาของเราครับ – เรามี Python project ขนาดกลางถึงใหญ่ ที่ใช้ flake8, black, และ isort ในการจัดการ code style แต่ทุกครั้งที่ run linting หรือ formatting มันจะใช้เวลาไปตั้งเยอะแยะเลย! บางทีก็เป็นเวลา 10-15 นาทีต่อไฟล์ ซึ่งมันทำให้ workflow ช้าลงอย่างเห็นได้ชัด แถมยังต้องมานั่งปรับแก้ error ที่ black หรือ isort ทำขึ้นมาอีกต่างหาก ผมเองก็เคยรู้สึก frustated กับเรื่องนี้มาก และเชื่อว่าหลายๆ คนก็คงเคยเจอปัญหาคล้ายๆ กัน

บทความนี้จะช่วยให้เราแก้ปัญหานี้ได้ง่ายๆ ด้วยเครื่องมือชื่อ Ruff ซึ่งเป็น linter และ formatter สำหรับ Python ที่รวดเร็วและมีประสิทธิภาพกว่า flake8+black+isort ถึง 100 เท่า แถมยังตั้งค่าได้ง่ายมากๆ แค่ 5 นาทีก็พร้อมใช้งานแล้วครับ เราจะมาเจาะลึกการใช้งาน Ruff รวมถึงข้อควรระวังต่างๆ เพื่อให้คุณสามารถนำไปปรับใช้กับโปรเจกต์ของคุณได้อย่างมีประสิทธิภาพ

ก่อนเริ่ม เราจะใช้ Python 3.11 และ Ruff version 0.18.1 นะครับ Prerequisite ที่จำเป็นคือ Python 3.7 หรือสูงกว่า และ pip (ตัวจัดการ package ของ Python) ถ้ายังไม่มี pip ให้ติดตั้งตามคำแนะนำบนเว็บไซต์ pip

ติดตั้ง Ruff

closeup photo of computer code screengrab
Photo by Pankaj Patel on Unsplash
pip install ruff

หลังจากติดตั้งเสร็จแล้ว ให้ลองตรวจสอบการติดตั้งด้วยคำสั่ง:

ruff --version

ถ้าแสดง version ของ Ruff ออกมา เราก็เรียบร้อยครับ!

การตั้งค่า Ruff

Ruff นั้นมีความยืดหยุ่นในการตั้งค่ามาก เราสามารถกำหนดไฟล์ configuration ได้หลายรูปแบบ แต่สำหรับการเริ่มต้น เราสามารถใช้ไฟล์ .ruff.conf ใน root ของโปรเจกต์ได้เลย ถ้าไม่มีไฟล์นี้ Ruff จะสร้างให้เราโดยอัตโนมัติ

ruff --init

ไฟล์ .ruff.conf จะมีรูปแบบดังนี้:


[tool.ruff]
    source = "python"
    target = "python"
    select = ["E", "W", "I"] # เลือก error, warning, information
    ignore = ["F"]  # ปฏิเสธข้อความที่กำหนด
    show_source = false
    extend_typing_hints = true
  

อธิบาย: * `source` และ `target` กำหนดภาษาที่ Ruff จะใช้ * `select` ระบุ error codes ที่ต้องการให้ Ruff ตรวจสอบ * `ignore` ระบุ error codes ที่ต้องการเพิกเฉย * `show_source` บอกว่า Ruff ควรแสดง source code หรือไม่ * `extend_typing_hints` ช่วยให้ Ruff ตรวจสอบ type hints ได้ดียิ่งขึ้น

การใช้งาน Ruff

black flat screen computer monitor
Photo by Godfrey Nyangechi on Unsplash

การใช้งาน Ruff นั้นง่ายมากๆ เพียงแค่ใช้คำสั่ง:

ruff 

Ruff จะทำการ linting และ formatting ไฟล์ โดยอัตโนมัติ ถ้ามี error หรือ warning Ruff จะแสดงผลออกมาพร้อมกับข้อแนะนำในการแก้ไข

ตัวอย่าง:

# my_script.py
def my_function(x):
    return x + 1 # ไม่ใส่ space หลังเครื่องหมาย +

เมื่อรันคำสั่ง `ruff my_script.py` Ruff จะแสดงข้อความ:

# my_script.py:2:6 - E265 - Whitespace should not be used before +, but is

และ Ruff จะทำการแก้ไขไฟล์ my_script.py ให้ถูกต้องโดยอัตโนมัติ:

# my_script.py
def my_function(x):
    return x + 1

การทำงานร่วมกับ IDE

Ruff สามารถทำงานร่วมกับ IDE หลายตัวได้ เช่น VS Code, PyCharm เราสามารถติดตั้ง extension ของ Ruff ใน IDE ของเราเพื่อทำการ linting และ formatting ได้แบบ real-time วิธีนี้จะช่วยให้เราสามารถแก้ไข error และปรับปรุง code style ได้ทันทีที่เขียน code

สิ่งที่ควรระวัง / ข้อผิดพลาดที่เจอบ่อย

แม้ว่า Ruff จะใช้งานง่าย แต่ก็มีบางสิ่งที่ควรระวังและข้อผิดพลาดที่เจอบ่อยๆ ครับ

  • **การตั้งค่าไฟล์ configuration:** การตั้งค่าไฟล์ .ruff.conf ไม่ถูกต้อง อาจทำให้ Ruff ไม่ทำงานตามที่ต้องการ ควรตรวจสอบว่า syntax ถูกต้องและ error codes ที่เลือกนั้นเหมาะสมกับโปรเจกต์ของคุณหรือไม่
  • **Conflict กับเครื่องมืออื่นๆ:** Ruff อาจมี conflict กับเครื่องมืออื่นๆ ที่ใช้ในโปรเจกต์ของคุณ หากพบปัญหา ให้ลอง disable เครื่องมืออื่นๆ ชั่วคราวเพื่อตรวจสอบว่า Ruff เป็นสาเหตุของปัญหาหรือไม่ (โดยเฉพาะถ้าใช้ tools ที่จัดการ code style เอง)
  • **Type hints:** Ruff สามารถตรวจสอบ type hints ได้ดี แต่ถ้า type hints ไม่ถูกต้อง Ruff อาจแจ้ง error ที่ไม่เกี่ยวข้อง ควรตรวจสอบให้แน่ใจว่า type hints ถูกต้องและสอดคล้องกับ requirements ของโปรเจกต์

เราเคยเจอปัญหาเมื่อทีมเราใช้ flake8 ในการ linting ไปพร้อมกับ Ruff ด้วย ทำให้เกิดการ conflict ใน error messages ซึ่งทำให้การ debug ยากขึ้น จริงๆ ผมไม่ค่อยชอบวิธีนี้เพราะมันทำให้ workflow ซับซ้อนขึ้น

สรุปและประสบการณ์ส่วนตัว

Ruff เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการ linting และ formatting Python ผมเองก็เคยใช้ Ruff ในโปรเจกต์ต่างๆ แล้วพบว่ามันช่วยลดเวลาในการจัดการ code style ได้อย่างมาก ด้วยความเร็วที่เหนือกว่า flake8+black+isort ถึง 100 เท่า Ruff จึงเป็นตัวเลือกที่คุ้มค่าอย่างยิ่งสำหรับโปรเจกต์ขนาดใหญ่ หรือทีมพัฒนาที่มีความต้องการในการจัดการ code style ที่เข้มงวด

ผมแนะนำให้ลองนำ Ruff ไปใช้กับโปรเจกต์ของคุณดูครับ ผมเชื่อว่าคุณจะพอใจกับประสิทธิภาพและความสะดวกในการใช้งานของมัน

หลังจากใช้งาน Ruff แล้ว ผมแนะนำให้เราเริ่มต้นด้วยการตั้งค่าไฟล์ .ruff.conf ให้เหมาะสมกับโปรเจกต์ของเรา และเรียนรู้วิธีการใช้งาน command-line arguments ต่างๆ จากนั้น เราสามารถเชื่อมต่อ Ruff กับ IDE ของเราเพื่อทำการ linting และ formatting ได้แบบ real-time สุดท้าย เราควรทำการ review code ของเราอย่างสม่ำเสมอ เพื่อให้มั่นใจว่า code ของเราเป็นไปตามมาตรฐานที่กำหนด

คำถาม

คำถาม: Ruff ทำงานร่วมกับ IDE อื่นๆ ได้หรือไม่?

คำตอบ: Ruff ทำงานร่วมกับ IDE หลายตัวได้ เช่น VS Code, PyCharm และมี extension ให้ใช้งานมากมาย

คำถาม: Ruff สามารถปรับแต่งได้หรือไม่?

คำตอบ: Ruff สามารถปรับแต่งได้หลากหลายรูปแบบ ผ่านไฟล์ .ruff.conf

คำถาม: Ruff เหมาะกับโปรเจกต์ขนาดไหน?

คำตอบ: Ruff เหมาะกับโปรเจกต์ขนาดกลางถึงใหญ่ แต่ก็สามารถนำไปใช้กับโปรเจกต์ขนาดเล็กได้เช่นกัน

สินค้าแนะนำที่เกี่ยวข้อง

Sponsored · Lazada
Boonyadol Morruchai (Senior Full-stack Developer)

ผมเป็น IT Professional ที่มีประสบการณ์ในสายงานมากว่า 20 ปี เชี่ยวชาญการออกแบบระบบ Enterprise และ Automation Tools ปัจจุบันมุ่งเน้นการประยุกต์ใช้ AI (Gemini/OpenAI) เพื่อเพิ่มประสิทธิภาพในการเขียน Code และการจัดการข้อมูลขนาดใหญ่ บล็อกนี้สร้างขึ้นเพื่อแชร์ "ประสบการณ์หน้างาน" ปัญหาจริงที่เจอ และวิธีแก้ปัญหาฉบับ Senior Dev ครับ

แสดงความคิดเห็น

ใหม่กว่า เก่ากว่า