Използвате ли терминала повече от базирани на GUI операционни системи? Или обикновено разработвате програми с интерфейс на командния ред, използвайки Python? Наскоро намерих невероятна библиотека на Python, наречена „Rich“ в GitHub, която вече има 15,2 хиляди звезди по времето, когато пиша тази статия.

Той може не само да показва текст в цвят и стилове в терминала, но и емотикони, таблици, ленти за напредъка, маркдаун и дори синтаксисно подчертан код. Ако сте прочели някоя от предишните ми статии по-долу:



Библиотеката „Rich“ може да прави почти всичко, което представих в тази статия, както и някои други страхотни неща.

В тази статия ще представя тази библиотека с примери, за да покажа нейните възможности.

Въведение и монтаж

Изображението по-горе показва основните функции, които библиотеката може да направи. Можете да намерите проекта на GitHub:



Библиотеката изисква Python 3.6.1 или по-нова версия, за да бъде функционална. Инсталирането на библиотеката е доста лесно, защото можем да използваме pip.

pip install rich

Богат печат

Нека първо да видим как може да печата.

Етикети и емотикони

Поддържа етикети за форматиране и емотикони.

from rich import print
print("Hello, [bold blue]Towards Data Science[/bold blue]!", ":thumbs_up:", "[u]By[/u]", "[i]Christopher Tao[/i]")

Акцент на синтаксиса

Той може също така автоматично да форматира речник и да маркира ключови думи и изходи на Python. Например, нека изведем локалната среда в Python с помощта на метода locals().

Горният пример показва разликата между изхода със и без богатата библиотека.

Богат REPL

Можем също така да инсталираме Python REPL, като използваме богатата библиотека, така че всякакви структури от данни да могат да бъдат отпечатани и маркирани въз основа на стандартите.

from rich import pretty
pretty.install()
{"bool1":True, "bool2":False, "number":123.45, "string":"Hello!", "dict":{"key":"value"}, "list":[1,2,3], "class":type(1)}

Pretty Print Документация на класове/методи

Може би знаете, че можем да използваме __doc__ и help() методи за показване на документация на клас/обект/метод на Python. Трудно е обаче да се чете в терминала.

str.__doc__
help(str)

Като използваме библиотеката Rich, можем да използваме нейната функция inspect() за красиво отпечатване на горната документация.

from rich import inspect
inspect(str, methods=True)

Флагът methods ще реши дали методите се показват в документацията. Ако е вярно, това е еквивалентно на help(). В противен случай е еквивалентно на __doc__.

Акцент в синтаксиса на кода на Python

Предполагам, че няма да се изненадате, че библиотеката може да отпечата код с подчертан синтаксис, защото можем да видим функцията в предишния пример.

Нека просто го илюстрирам с помощта на прост пример. По-долу е само случайна част от кода в същността ми.

from rich.console import Console
from rich.syntax import Syntax
code_snippet = '''
def max_vote_recursive(states, days_left, index):
    # Terminating conditions
    if len(states) == 0 or index >= len(states) or days_left <= 0:
        return 0
    # If we have enough days, go to this state
    votes_if_go = 0
    if states[index]['days'] <= days_left:
        votes_if_go = states[index]['votes'] + max_vote_recursive(states, days_left - states[index]['days'], index + 1)
    # If we don't go to this state
    votes_if_not_go = max_vote_recursive(states, days_left, index + 1)
    return max(votes_if_go, votes_if_not_go)
'''
syntax = Syntax(code_snippet, "python", line_numbers=True)
console = Console()
console.print(syntax)

Това е като в базирана на GUI IDE, супер готино!

Разширен печат с помощта на конзолен обект

Богатата библиотека също така предоставя модул, наречен „Конзола“, който позволява по-персонализирани стилове на разпечатки и някои функции извън кутията. Можем да импортираме модула и да инстанцираме обекта, както следва.

from rich.console import Console
console = Console()

Например, методът log() на конзолен обект може да отпечата изход „log style“ на екрана.

console.log("We are using", console, "!")

Моля, имайте предвид, че времето се добавя автоматично в регистрационните файлове.

Обектът на конзолата също има флаг log_locals, който може да бъде много полезен инструмент за отстраняване на грешки. Той извежда всички локални променливи в момента в паметта.

console.log("All local variables", log_locals=True)

Интегриране с библиотеката за регистриране

Python има вградена библиотека за регистриране, която се използва за показване на регистрационни файлове с различни нива и формати. Библиотеката Rich може безпроблемно да се интегрира с библиотеката, за да осигури допълнително изживяване с красив печат.

Нека първо импортираме библиотеката за регистриране и инициализираме обекта на журнала.

import logging
from rich.logging import RichHandler
FORMAT = "%(message)s"
logging.basicConfig(
    level="NOTSET", format=FORMAT, datefmt="[%X]", handlers=[RichHandler()]
)
log = logging.getLogger("rich")

След това можем да изведем някои регистрационни файлове, за да видим какво ще се случи.

log.debug("Debug Message.")
log.info("Info Message.")
log.warning("Warning Message.")
log.error("Error Message.")
log.fatal("Fatal Message.")

Много готино, нашите трупи ще бъдат оцветени в терминала сега.

Python Traceback Beautifier

Бях наистина изумен от тази функция. Сигурен съм, че и вие ще го направите. Библиотеката Rich може да покаже проследяването на всяко очакване по много разбираем начин. Тази функция е готова и всъщност е комбинация от всички горепосочени функции.

За да илюстрираме всички елементи на красивото проследяване, трябва да имаме относително сложен код. Така че, моля, позволете ми да използвам екранната снимка от официалната страница за readme на GitHub.

Богати таблици

Библиотеката Rich може също така да покаже таблица много красиво. По-важното е, че стилът и пренасянето на думи ще бъдат автоматично коригирани въз основа на ширината на прозореца на терминала.

Ето кодов фрагмент, който може да генерира таблица с помощта на библиотеката Rich. В крайна сметка ще бъде отпечатан.

from rich.console import Console
from rich.table import Table
console = Console()
table = Table(show_header=True, header_style="bold magenta")
table.add_column("Date", style="dim", width=12)
table.add_column("Title")
table.add_column("Production Budget", justify="right")
table.add_column("Box Office", justify="right")
table.add_row(
    "Dev 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118"
)
table.add_row(
    "May 25, 2018",
    "[red]Solo[/red]: A Star Wars Story",
    "$275,000,000",
    "$393,151,347",
)
table.add_row(
    "Dec 15, 2017",
    "Star Wars Ep. VIII: The Last Jedi",
    "$262,000,000",
    "[bold]$1,332,539,889[/bold]",
)
console.print(table)

Както бе споменато по-горе, таблицата ще пасне на текущата ширина на прозореца на терминала, за да се уверите, че таблицата се показва перфектно.

Богати ленти за напредък

Богатата библиотека също така предоставя невероятна функция за лента за напредък. Употребата също е изключително проста.

from rich.progress import track
from time import sleep
for step in track(range(100), description="Writing Medium Story..."):
    sleep(0.1)

Разбира се, лентата за напредъка е много гъвкава и може да се персонализира с много аспекти, като показване на множество ленти за напредък заедно и подробен текст на етикета за напредъка, както следва.

Rich Markdown

Библиотеката Rich може също да показва текст за маркиране в терминала.

Предварително създадох примерен файл за маркиране. След това можем да импортираме модула Markdown в библиотеката Rich, за да го покажем.

from rich.console import Console
from rich.markdown import Markdown
console = Console()
with open("test.md") as md:
    markdown = Markdown(md.read())
console.print(markdown)

Въпреки че не може да показва заглавките с различни размери на шрифта поради ограничението на терминала, той все още може да ги разграничи с помощта на различни стилове.

Резюме

ДОБРЕ. Моля, позволете ми да спра до тук. В тази библиотека има твърде много впечатляващи функции, които не мога да ги покажа в една статия, въпреки че демонстрирах тези, които смятам, че са най-интересни. Има още функции като колони, панел, подложки и групи за изобразяване, които също са страхотни. Силно препоръчително е да ги проверите сами.

GitHub Repo и официалната документация са както следва. Приятно кодиране!

  • GitHub хранилище


  • Богата библиотечна документация