使用Rich为自定义异常添加格式失效问题求助
问题原因与解决方案
问题原因
- 直接打印
args[0]时,Rich会解析字符串里的[red][bold]格式标记,正常渲染样式。 - 打印异常对象时,Rich使用专门的异常渲染逻辑,默认会把异常消息里的格式标记当成普通文本转义显示,不会解析执行。
foo=123能自动高亮是因为Rich的自动语法高亮功能,它会识别类似变量赋值的格式并自动给foo和123加亮,不管是字符串还是异常对象都会触发这个逻辑。
解决方案
给自定义异常实现__rich__方法,返回一个Rich可渲染对象(比如Text),让Rich打印异常时直接使用这个对象的渲染逻辑,就能保留格式了。
示例代码:
from rich.text import Text class InvalidSpec(ValueError): def __init__(self, args): loc = args.find("=") hdr = "invalid spec: " # 构建带基础文本的Text对象 self.display_text = Text(f"{hdr}{args}\n") # 追加带样式的空格和脱字符 self.display_text.append(' ' * (len(hdr) + loc), style="red bold") self.display_text.append('^', style="red bold") def __rich__(self): # 返回自定义的可渲染内容 return self.display_text # 测试 from rich import print as rprint rprint(InvalidSpec("foo=123"))
运行后打印异常对象,脱字符会正确显示为红色粗体,foo=123的自动高亮也会保留。
内容的提问来源于stack exchange,提问作者suvayu
相关产品推荐
相关产品推荐

