Tutorial

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

By Arnon Puitrakul - 18 พฤษภาคม 2022 - 1 min read min(s)

ทำ 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 แล้วทำงานนั่นนี่ได้แบบ สุด ๆ ไปเลย พวกนี้ที่เหลือ ก็ขึ้นกับจินตนาการของเราแล้วละว่า เราจะเอามันมาทำอะไร แต่ส่วนใหญ่ที่เราใช้งาน เราก็ใช้งานในส่วนที่เราเอามาเขียนให้อ่านกันวันนี้เลย