控制台协议

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 举个例子。它应该返回其他可呈现对象的可迭代对象。尽管这意味着 could 返回一个容器(如列表),通常使用 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 物体。段由一段文本和一种可选样式组成。下面的示例在呈现 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 对象。测量对象应包含 minimummaximum 渲染所需的字符数。

例如,如果要渲染国际象棋棋盘,则至少需要8个字符才能渲染。最大可用宽度可以保留为最大可用宽度(假设板子居中):

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