Kodėl terminalo išvestis neturi būti nuobodi
Prisimenu laikus, kai mano Python skriptai spausdino tekstą į terminalą kaip kokia 1990-ųjų DOS programa – vienspalvės eilutės, jokios struktūros, o debug’inant didesnį projektą reikėdavo žiūrėti į ekraną kaip į Matrix’o kadrus. Tada atradau Rich biblioteką ir supratau, kad terminalo aplikacijos gali atrodyti ne tik funkcionaliai, bet ir gražiai.
Rich – tai Python biblioteka, kuri leidžia sukurti spalvingą, struktūruotą ir interaktyvią išvestį terminale. Tai ne kažkoks papuošalas, o realiai naudingas įrankis, kuris padeda greičiau suprasti, kas vyksta jūsų programoje. Kai matote gražiai suformatuotą lentelę su duomenimis vietoj chaotiškų print() eilučių, darbas tampa ne tik efektyvesnis, bet ir malonesnis.
Įdiegimas ir pirmieji žingsniai
Pradėti naudoti Rich yra paprasčiau nei užsivirti kavos. Atidarote terminalą ir įrašote:
pip install rich
Viskas. Biblioteka įdiegta ir galite pradėti kurti. Pirmasis dalykas, kurį turėtumėte išbandyti, yra Console objektas – tai jūsų pagrindinis įrankis bendraujant su terminalu:
from rich.console import Console
console = Console()
console.print("Labas, [bold magenta]pasauli![/bold magenta]")
Šis paprastas pavyzdys jau demonstruoja vieną iš pagrindinių Rich privalumų – galite naudoti markup sintaksę tiesiai teksto eilutėse. Nereikia jokių sudėtingų formatavimo funkcijų ar ANSI kodų – tiesiog rašote [bold], [italic], [red] ir pan.
Kas įdomu, Console automatiškai aptinka jūsų terminalo galimybes. Jei terminale palaikomos spalvos ir emoji – matysite viską pilnoje gražybėje. Jei ne – Rich automatiškai supaprastins išvestį. Tai reiškia, kad jūsų kodas veiks visur, nuo modernių terminalų iki senų serverių SSH sesijų.
Lentelės, kurios nedaro gėdos
Viena iš labiausiai naudojamų Rich funkcijų mano darbe yra lentelių kūrimas. Anksčiau, norėdamas parodyti duomenis lentelės formatu, turėdavau arba rašyti savo formatavimo logiką, arba naudoti pandas (kas dažnai būdavo per daug dideliam projektui). Rich Table išsprendžia šią problemą elegantiškai:
from rich.table import Table
from rich.console import Console
console = Console()
table = Table(title="Serverių būsena")
table.add_column("Serveris", style="cyan", no_wrap=True)
table.add_column("CPU", justify="right", style="green")
table.add_column("RAM", justify="right", style="yellow")
table.add_column("Būsena", justify="center")
table.add_row("web-01", "23%", "4.2GB", "✓")
table.add_row("db-01", "89%", "15.8GB", "⚠")
table.add_row("cache-01", "12%", "2.1GB", "✓")
console.print(table)
Rezultatas? Profesionaliai atrodanti lentelė su rėmeliais, spalvomis ir tinkamu teksto lygiuote. Galite pridėti stiliaus taisykles, sąlyginį formatavimą, net piktogramas. Kai kuriate CLI įrankius administravimui ar monitoringui, tokios lentelės tampa neįkainojamos.
Dar vienas patarimas – galite naudoti `show_lines=True` parametrą, kad tarp eilučių būtų horizontalios linijos. Tai ypač naudinga, kai lentelėje yra daug duomenų ir norite aiškiai atskirti įrašus.
Progress bar’ai, kurie iš tikrųjų informatyvūs
Kiekvienas esame matę tuos primityvius progress bar’us, kurie rodo tik procentus arba dar blogiau – nieko nerodo, tik sukasi kažkoks spinner’is. Rich Progress modulis leidžia sukurti tikrai informatyvius progreso indikatorius:
from rich.progress import Progress
import time
with Progress() as progress:
task1 = progress.add_task("[red]Atsiunčiama...", total=1000)
task2 = progress.add_task("[green]Apdorojama...", total=1000)
task3 = progress.add_task("[cyan]Išsaugoma...", total=1000)
while not progress.finished:
progress.update(task1, advance=0.5)
progress.update(task2, advance=0.3)
progress.update(task3, advance=0.9)
time.sleep(0.02)
Šis kodas sukuria tris sinchronizuotus progress bar’us, kurie rodo skirtingų procesų eigą vienu metu. Matote ne tik procentus, bet ir greitį, likusį laiką, net galite pridėti papildomus laukus su custom informacija.
Praktikoje naudoju Progress visur, kur vyksta ilgiau trunkančios operacijos – failų apdorojimas, API užklausos, duomenų bazės migracijos. Vartotojams tai suteikia aiškų supratimą, kad programa dirba, o ne užstrigo. Be to, kai matote realų progresą su greičio rodikliais, galite įvertinti, ar jūsų optimizacijos veikia.
Syntax highlighting be IDE
Viena iš mano mėgstamiausių Rich funkcijų yra galimybė rodyti kodą su syntax highlighting tiesiai terminale. Tai neįtikėtinai naudinga kuriant dokumentaciją, mokymo medžiagą ar tiesiog debug’inant:
from rich.syntax import Syntax
from rich.console import Console
console = Console()
code = '''
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
'''
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(syntax)
Rich palaiko daugybę programavimo kalbų ir turi įvairių temų. Galite rodyti kodą su eilučių numeriais, highlight'inti konkrečias eilutes, net rodyti kodo fragmentus iš failų. Kai kuriate CLI įrankius kūrėjams, ši funkcija tampa būtinybe.
Aš naudoju Syntax objektą savo automatizuotose code review sistemose – kai skriptas aptinka problemą kode, jis parodo konkretų fragmentą su paryškinimu ir anotacijomis. Tai daug aiškiau nei paprasti error pranešimai su eilučių numeriais.
Logging'as, kuris nesukelia galvos skausmo
Standartinis Python logging modulis yra funkcionalus, bet jo išvestis... na, pasakysiu taip – ji nėra graži. Rich turi RichHandler, kuris integruojasi su standartiniu logging moduliu ir daro jį žmogišką:
import logging
from rich.logging import RichHandler
logging.basicConfig(
level="DEBUG",
format="%(message)s",
datefmt="[%X]",
handlers=[RichHandler(rich_tracebacks=True)]
)
log = logging.getLogger("rich")
log.info("Programa paleista")
log.warning("Atmintis beveik pilna")
log.error("Nepavyko prisijungti prie DB")
Dabar jūsų log'ai turi spalvas, aiškią struktūrą, o svarbiausia – `rich_tracebacks=True` parametras daro exception'us skaitomus. Vietoj begalinių teksto eilučių matote gražiai suformatuotą traceback su syntax highlighting, kintamųjų reikšmėmis ir aiškia klaidos vieta.
Dirbant su production sistemomis, kur log'ų srautas gali būti milžiniškas, tokia vizualizacija leidžia daug greičiau identifikuoti problemas. Spalvinis kodavimas pagal log level'į (INFO žalia, WARNING geltona, ERROR raudona) padeda akimis nuskaityti log'us ir iškart pastebėti, kas reikalauja dėmesio.
Markdown ir panel'ai terminale
Taip, teisingai skaitote – galite renderinti Markdown terminalą naudojant Rich. Tai puikiai tinka dokumentacijos rodymui, help pranešimams ar net interaktyviems tutorial'ams:
from rich.console import Console
from rich.markdown import Markdown
console = Console()
markdown_text = """
# Svarbios instrukcijos
## Kaip naudoti šį įrankį
1. Paleiskite su `--config` parametru
2. Pasirinkite **režimą**
3. Spauskite Enter
> **Pastaba:** Būtinai pasitikrinkite konfigūraciją prieš pradedant!
"""
md = Markdown(markdown_text)
console.print(md)
Panel'ai – tai dar vienas būdas struktūruoti informaciją. Galite sukurti spalvotus rėmelius aplink tekstą, lentelės, net kitus panel'us. Tai puikiai tinka svarbiems pranešimams ar warning'ams:
from rich.panel import Panel
from rich.console import Console
console = Console()
console.print(Panel(
"[bold red]DĖMESIO![/bold red]\n\nŠi operacija ištrins visus duomenis.\nAr tikrai norite tęsti?",
title="Patvirtinimas",
border_style="red"
))
Naudoju panel'us savo deployment skriptuose – prieš kritines operacijas rodau didelį raudoną panel'ą su įspėjimu. Tai daug efektyviau nei paprastas print() pranešimas, kurį lengva praleisti.
Kai viskas sueina į vieną
Rich tikroji galia atsiskleidžia, kai pradedi derinti skirtingas funkcijas kartu. Pavyzdžiui, galite sukurti dashboard'ą, kuris rodo realaus laiko informaciją su lentelėmis, progress bar'ais ir spalvotais statusais. Arba CLI įrankį, kuris turi interaktyvų meniu su gražia navigacija.
Vienas iš projektų, kuriame naudojau Rich, buvo deployment automatizavimo sistema. Vietoj nuobodžių log'ų ekrane matėsi: serverių būsenos lentelė, kiekvieno deployment žingsnio progress bar'ai, spalvotas status feed'as ir panel'ai su svarbiais įspėjimais. Sistema tapo ne tik funkcionalesnė, bet ir daug malonesnė naudoti – komandos nariai nebijojo deployment'ų, nes matė tiksliai, kas vyksta.
Kitas svarbus aspektas – Rich veikia puikiai su threading ir async kodu. Galite turėti kelis thread'us, kurie atnaujina skirtingus progress bar'us ar lentelės eilutes, ir viskas veiks sklandžiai be race condition'ų. Biblioteka viską tvarko už jus.
Jei kuriate CLI įrankius profesionaliam naudojimui, Rich turėtų būti jūsų įrankių dėžės dalis. Tai ne tik "gražumo" klausimas – tai apie user experience, apie tai, kaip greitai žmonės gali suprasti, kas vyksta, ir kaip maloniai jiems naudotis jūsų įrankiais. Terminalo aplikacijos nebūtinai turi atrodyti kaip iš praėjusio amžiaus – su Rich jos gali būti modernios, informatyvios ir malonios akiai.
