From de40df94cb16f018f0b9cd45b9c0becc75c6a99e Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Wed, 8 Apr 2026 23:26:55 -0500 Subject: [PATCH] perf: defer `pretty` import in console.py to Console.print() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move `from .pretty import Pretty, is_expandable` from module level to inside the `_collect_renderables()` method (called by `print()`). rich.pretty pulls in dataclasses, reprlib, array, and tries `import attr` — none of which are needed until something is actually printed. --- rich/console.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rich/console.py b/rich/console.py index ad92d529c0..90517cc842 100644 --- a/rich/console.py +++ b/rich/console.py @@ -50,7 +50,6 @@ from .markup import render as render_markup from .measure import Measurement, measure_renderables from .pager import Pager, SystemPager -from .pretty import Pretty, is_expandable from .protocol import rich_cast from .region import Region from .scope import render_scope @@ -1528,6 +1527,8 @@ def _collect_renderables( Returns: List[ConsoleRenderable]: A list of things to render. """ + from .pretty import Pretty as _Pretty, is_expandable as _is_expandable + renderables: List[ConsoleRenderable] = [] _append = renderables.append text: List[Text] = [] @@ -1568,9 +1569,9 @@ def check_text() -> None: elif isinstance(renderable, ConsoleRenderable): check_text() append(renderable) - elif is_expandable(renderable): + elif _is_expandable(renderable): check_text() - append(Pretty(renderable, highlighter=_highlighter)) + append(_Pretty(renderable, highlighter=_highlighter)) else: append_text(_highlighter(str(renderable)))