Tutorial

ทำ Command Line Interface ให้อลังการด้วย Rich

By Arnon Puitrakul - 18 พฤษภาคม 2022

ทำ Command Line Interface ให้อลังการด้วย Rich

ปกติเวลาเราเขียนโปรแกรมออกมาจริง ๆ อะ บ้างแหละ ที่เราเขียนออกมาเป็น GUI แต่ส่วนใหญ่แล้ว โปรแกรมที่เราใช้งานกัน เอาแบบ Developer หรือพวก Server ใช้งานกันก็จะอยู่ในรูปแบบของ Command Line ซะส่วนใหญ่ รุ่นใหญ่เขาใช้กันเว้ย แต่มันก็ดูเหือดแห้งเหลือเกิน เราอาจจะเคยเห็นบางโปรแกรมที่มีพวก Animation หรือการใส่สีลงไปใน Command Line ได้ด้วยเหมือนกัน สำหรับใน Python เองก็มี Library ที่ทำอะไรแบบนี้เหมือนกันคือ Rich นั่นเอง

ติดตั้ง Rich

// Conda
conda install rich

// Pip
pip install rich

เรามาติดตั้ง ความรวย กันดีกว่า ชื่อก็คือ รู้สึกถึงเงินแล้ว เราสามารถติดตั้งมันได้จาก Package Manager ที่เราใช้งานตรง ๆ ได้เลย เช่น Conda และ Pip เป็นต้น

ใส่ Style ให้ตัวหนังสือ

เรามาเริ่มกับอะไรที่ Basic กันก่อนดีกว่า คือ การใส่พวก สี และ Style ให้ตัวหนังสือ เช่น ตัวหนา ตัวเอียงอะไรแบบนั้น มันก็ทำได้เหมือนกัน แล้วบอกเลยว่า โคตรง่าย

from rich import print

print("If you [u]smoke[/u] [i](what you [green]smoke?[/green])[/i] I got the [u]haze[/u] [bold purple](Purple Haze)[/bold purple]")

เราแค่เรียกคำสั่ง print ออกมาจาก rich ตรง ๆ ได้เลย มันก็จะไปทับ คำสั่ง print ปกติออกไป แล้วเราก็สามารถใส่ Styling ได้ตามที่เราต้องการเลย เช่น u ก็คือ Underline หรือขีดเส้นใต้ นอกจากนั้น เราก็สามารถใส่สีได้ด้วย ผ่านการพิมพ์ชื่อสีเข้าไปตรง ๆ ได้เลย

เราก็จะได้แบบด้านบนเลย เราจะเห็นว่า ตรงที่เราใส่เขียว มันก็จะเขียวเลย กับตรงที่เราใส่ bold purple มันก็จะได้ออกมาเป็นตัวหนาสีม่วง แค่นี้ก็ทำให้มันอลังการแล้ว แต่ ๆๆ มันยังไม่หมด

Inspect

>>> dir(list)
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

เวลาเราเรียกพวก Method อยากรู้ว่ามันทำอะไรได้บ้าง เราก็จะเรียกมันออกมาเช่น อยากรู้ว่า list ในนั้นมันมีอะไรบ้าง เราก็สามารถใช้คำสั่ง dir(list) ตรง ๆ ได้เลย แต่เราจะเห็นว่า มันก็แอบดูยากไปหน่อย ไม่สวยงามเลย ใน Rich เองมันก็มีอะไรแบบนี้มาให้เราด้วย

from rich import inspect
inspect(list, methods=True)
ทำ Command Line Interface ให้อลังการด้วย Rich

เราก็จะได้แบบด้านบนเลย มันก็จะแสดงออกมาเลยว่า มันเป็นอะไร แล้วในนั้นมันมี Method อะไรบ้าง พร้อมกับบอกเลยว่ามันทำอะไร ถ้าเราไม่ได้ใช้ List เราก็ต้องเข้าไปเปิดทีละคำสั่งว่าอันไหนมันทำอะไรยังไงบ้าง แต่อันนี้เขาทำมาให้เราหมดแล้ว ดีมาก ๆ เวลเราเขียนโปรแกรม

Logging

ทำ Command Line Interface ให้อลังการด้วย Rich

อีกหนึ่งอย่างที่เราใช้เยอะมาก แล้วมันดีมาก ๆ คือ การทำ Logging ปกติ เราก็ใช้งาน Logging ใน Python อยู่แล้วนะ เพราะมันทำให้เราจัดการ Log ได้ง่ายมาก ๆ ตั้งแต่การบอกปลายทางว่า เราจะออกหน้าจอ และออกไฟล์อะไรแบบนั้น

Logging ใน Rich ก็ทำมาให้ง่ายเลยละ ถ้าเราคุ้นเคยกับ Logging ใน Python อยู่แล้ว เราก็แค่กำหนด Style ของ Log แล้วใช้งานผ่านคำสั่งของ Python Log ได้ตามปกติเลย ดังนั้น เราแทบไม่จำเป็นต้องเปลี่ยนแปลง Code เยอะเลย เพื่อให้เราสามารถมาใช้งานบน Rich ได้ ที่เหลือ ก็น่าจะเป็นแค่การตกแต่งให้เรียบร้อยเท่านั้นเอง

สรุป

จริง ๆ Rich ทำได้เยอะกว่านี้มาก ๆ เช่น พวก Progress Bar จนไปถึงพวกการวาดตาราง และพวก Markdown ทำได้หมดเลย คือ เราทำได้ตั้งแต่ CLI ง่าย ๆ จนไปถึงพวกที่เป็น Rich CLI อลังการงานสร้าง แบ่ง Panel แล้วทำงานนั่นนี่ได้แบบ สุด ๆ ไปเลย พวกนี้ที่เหลือ ก็ขึ้นกับจินตนาการของเราแล้วละว่า เราจะเอามันมาทำอะไร แต่ส่วนใหญ่ที่เราใช้งาน เราก็ใช้งานในส่วนที่เราเอามาเขียนให้อ่านกันวันนี้เลย

Read Next...

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

เวลาเราทำงานกับข้อมูลอย่าง Pandas DataFrame หนึ่งในงานที่เราเขียนลงไปให้มันทำคือ การ Apply Function เข้าไป ถ้าข้อมูลมีขนาดเล็ก มันไม่มีปัญหาเท่าไหร่ แต่ถ้าข้อมูลของเราใหญ่ มันอีกเรื่องเลย ถ้าเราจะเขียนให้เร็วที่สุด เราจะทำได้โดยวิธีใดบ้าง วันนี้เรามาดูกัน...

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

Python เป็นภาษาที่เราใช้งานกันเยอะมาก ๆ เพราะความยืดหยุ่นของมัน แต่ปัญหาของมันก็เกิดจากข้อดีของมันนี่แหละ ทำให้เมื่อเราต้องการ Performance แต่ถ้าเราจะบอกว่า เราสามารถทำได้ดีทั้งคู่เลยละ จะเป็นยังไง เราขอแนะนำ Numba ที่ใช้งาน JIT บอกเลยว่า เร็วขึ้นแบบ 700 เท่าตอนที่ทดลองกันเลย...

Humanise the Number in Python with "Humanize"

Humanise the Number in Python with "Humanize"

หลายวันก่อน เราทำงานแล้วเราต้องการทำงานกับตัวเลขเพื่อให้มันอ่านได้ง่ายขึ้น จะมานั่งเขียนเองก็เสียเวลา เลยไปนั่งหา Library มาใช้ จนไปเจอ Humanize วันนี้เลยจะเอามาเล่าให้อ่านกันว่า มันทำอะไรได้ แล้วมันล่นเวลาการทำงานของเราได้ยังไง...

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

การทำงานกับตัวเลขทศนิยมบนคอมพิวเตอร์มันมีความลับซ่อนอยู่ เราอาจจะเคยเจอเคสที่ เอา 0.3 + 0.6 แล้วมันได้ 0.899 ซ้ำไปเรื่อย ๆ ไม่ได้ 0.9 เพราะคอมพิวเตอร์ไม่ได้มองระบบทศนิยมเหมือนกับคนนั่นเอง บางตัวมันไม่สามารถเก็บได้ เลยจำเป็นจะต้องประมาณเอา เราเลยเรียกว่า Floating Point Approximation...