控制台协议

Rich 支持一个简单的协议,为自定义对象添加富格式化功能,这样您就可以 print() 使用颜色、样式和格式化来显示您的对象。

将此用于演示或显示从典型的 __repr__ 字符串中难以解析的其他调试信息。

控制台定制

为您的对象定制控制台输出最简单的方法是实现一个 __rich__ 方法。此方法不接受任何参数,应该返回 Rich 知道如何渲染的对象,例如 TextTable。如果您返回一个普通字符串,它将被渲染为 控制台标记。以下是一个示例

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__ 方法,该方法接受一个 ConsoleConsoleOptions 并返回一个 Measurement 对象。Measurement 对象应该包含渲染所需的最小和最大字符数。

例如,如果我们要渲染一个棋盘,它将需要至少 8 个字符来渲染。最大值可以保留为最大可用宽度(假设棋盘居中)

class ChessBoard:
    def __rich_measure__(self, console: Console, options: ConsoleOptions) -> Measurement:
        return Measurement(8, options.max_width)