控制台协议¶
Rich 支持一个简单的协议,为自定义对象添加富格式化功能,这样您就可以 print()
使用颜色、样式和格式化来显示您的对象。
将此用于演示或显示从典型的 __repr__
字符串中难以解析的其他调试信息。
控制台定制¶
为您的对象定制控制台输出最简单的方法是实现一个 __rich__
方法。此方法不接受任何参数,应该返回 Rich 知道如何渲染的对象,例如 Text
或 Table
。如果您返回一个普通字符串,它将被渲染为 控制台标记。以下是一个示例
class MyObject:
def __rich__(self) -> str:
return "[bold cyan]MyObject()"
如果您要打印或记录 MyObject
的实例,它将以粗体青色渲染为 MyObject()
。当然,您会希望将其用于更好的用途,也许是通过添加专门的语法高亮。
控制台渲染¶
__rich__
方法仅限于单个可渲染对象。对于更高级的渲染,请在您的类中添加一个 __rich_console__
方法。
__rich_console__
方法应该接受一个 Console
和一个 ConsoleOptions
实例。它应该返回其他可渲染对象的迭代器。虽然这意味着它可以返回一个容器,例如列表,但通常通过使用 yield
语句(使方法成为生成器)更容易实现。
以下是一个 __rich_console__
方法的示例
from dataclasses import dataclass
from rich.console import Console, ConsoleOptions, RenderResult
from rich.table import Table
@dataclass
class Student:
id: int
name: str
age: int
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
yield f"[b]Student:[/b] #{self.id}"
my_table = Table("Attribute", "Value")
my_table.add_row("name", self.name)
my_table.add_row("age", str(self.age))
yield my_table
如果您要打印一个 Student
实例,它将在终端中渲染一个简单的表格。
低级渲染¶
为了完全控制自定义对象在终端中的渲染方式,您可以生成 Segment
对象。Segment 包含一段文本和一个可选的样式。以下示例在渲染 MyObject
实例时写入多色文本
class MyObject:
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
yield Segment("My", Style(color="magenta"))
yield Segment("Object", Style(color="green"))
yield Segment("()", Style(color="cyan"))
测量可渲染对象¶
有时 Rich 需要知道一个对象在渲染时将占用多少个字符。例如,Table
类将使用此信息来计算列的最佳尺寸。如果您没有使用 Rich 模块中的任何可渲染对象,则需要提供一个 __rich_measure__
方法,该方法接受一个 Console
和 ConsoleOptions
并返回一个 Measurement
对象。Measurement 对象应该包含渲染所需的最小和最大字符数。
例如,如果我们要渲染一个棋盘,它将需要至少 8 个字符来渲染。最大值可以保留为最大可用宽度(假设棋盘居中)
class ChessBoard:
def __rich_measure__(self, console: Console, options: ConsoleOptions) -> Measurement:
return Measurement(8, options.max_width)