控制台协议¶
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
举个例子。它应该返回其他可呈现对象的可迭代对象。尽管这意味着 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__
方法,它接受 Console
和 ConsoleOptions
并返回一个 Measurement
对象。测量对象应包含 minimum 和 maximum 渲染所需的字符数。
例如,如果要渲染国际象棋棋盘,则至少需要8个字符才能渲染。最大可用宽度可以保留为最大可用宽度(假设板子居中):
class ChessBoard:
def __rich_measure__(self, console: Console, options: ConsoleOptions) -> Measurement:
return Measurement(8, options.max_width)