Skip to content

Commit e5559c2

Browse files
committed
Lazy import _colorize in traceback with shutdown fallback
1 parent 836fbda commit e5559c2

1 file changed

Lines changed: 39 additions & 10 deletions

File tree

Lib/traceback.py

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,39 @@
1616
import io
1717
import importlib.util
1818
import pathlib
19-
import _colorize
19+
lazy import _colorize
2020

2121
from contextlib import suppress
2222

23+
24+
class _ShutdownTheme:
25+
"""Empty stand-in if `_colorize` cannot be imported during late shutdown."""
26+
def __getattr__(self, _): return self
27+
def __getitem__(self, _): return ""
28+
def __format__(self, _): return ""
29+
def __str__(self): return ""
30+
def __add__(self, other): return other
31+
__radd__ = __add__
32+
33+
34+
_shutdown_theme = _ShutdownTheme()
35+
36+
37+
def _safe_get_theme(*, force_color=False, force_no_color=False):
38+
try:
39+
return _colorize.get_theme(
40+
force_color=force_color, force_no_color=force_no_color
41+
)
42+
except ImportError:
43+
return _shutdown_theme
44+
45+
46+
def _safe_can_colorize(*, file=None):
47+
try:
48+
return _colorize.can_colorize(file=file)
49+
except ImportError:
50+
return False
51+
2352
try:
2453
from _missing_stdlib_info import _MISSING_STDLIB_MODULE_MESSAGES
2554
except ImportError:
@@ -151,7 +180,7 @@ def print_exception(exc, /, value=_sentinel, tb=_sentinel, limit=None, \
151180
def _print_exception_bltin(exc, file=None, /):
152181
if file is None:
153182
file = sys.stderr if sys.stderr is not None else sys.__stderr__
154-
colorize = _colorize.can_colorize(file=file)
183+
colorize = _safe_can_colorize(file=file)
155184
return print_exception(exc, limit=BUILTIN_EXCEPTION_LIMIT, file=file, colorize=colorize)
156185

157186

@@ -199,9 +228,9 @@ def _format_final_exc_line(etype, value, *, insert_final_newline=True, colorize=
199228
valuestr = _safe_string(value, 'exception')
200229
end_char = "\n" if insert_final_newline else ""
201230
if colorize:
202-
theme = _colorize.get_theme(force_color=True).traceback
231+
theme = _safe_get_theme(force_color=True).traceback
203232
else:
204-
theme = _colorize.get_theme(force_no_color=True).traceback
233+
theme = _safe_get_theme(force_no_color=True).traceback
205234
if value is None or not valuestr:
206235
line = f"{theme.type}{etype}{theme.reset}{end_char}"
207236
else:
@@ -555,9 +584,9 @@ def format_frame_summary(self, frame_summary, **kwargs):
555584
if frame_summary.filename.startswith("<stdin-") and frame_summary.filename.endswith('>'):
556585
filename = "<stdin>"
557586
if colorize:
558-
theme = _colorize.get_theme(force_color=True).traceback
587+
theme = _safe_get_theme(force_color=True).traceback
559588
else:
560-
theme = _colorize.get_theme(force_no_color=True).traceback
589+
theme = _safe_get_theme(force_no_color=True).traceback
561590
row.append(
562591
' File {}"{}"{}, line {}{}{}, in {}{}{}\n'.format(
563592
theme.filename,
@@ -1336,9 +1365,9 @@ def format_exception_only(self, *, show_group=False, _depth=0, **kwargs):
13361365
"""
13371366
colorize = kwargs.get("colorize", False)
13381367
if colorize:
1339-
theme = _colorize.get_theme(force_color=True).traceback
1368+
theme = _safe_get_theme(force_color=True).traceback
13401369
else:
1341-
theme = _colorize.get_theme(force_no_color=True).traceback
1370+
theme = _safe_get_theme(force_no_color=True).traceback
13421371

13431372
indent = 3 * _depth * ' '
13441373
if not self._have_exc_type:
@@ -1486,9 +1515,9 @@ def _format_syntax_error(self, stype, **kwargs):
14861515
# Show exactly where the problem was found.
14871516
colorize = kwargs.get("colorize", False)
14881517
if colorize:
1489-
theme = _colorize.get_theme(force_color=True).traceback
1518+
theme = _safe_get_theme(force_color=True).traceback
14901519
else:
1491-
theme = _colorize.get_theme(force_no_color=True).traceback
1520+
theme = _safe_get_theme(force_no_color=True).traceback
14921521
filename_suffix = ''
14931522
if self.lineno is not None:
14941523
yield ' File {}"{}"{}, line {}{}{}\n'.format(

0 commit comments

Comments
 (0)