1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
import traceback
from contextlib import contextmanager
from typing import Optional, List
from ._compatibility import compatibility
__all__ = ['override_stack_trace', 'set_stack_trace', 'append_stack_trace', 'format_stack', 'is_stack_trace_overridden']
current_stack: List[str] = []
is_overridden = False
@compatibility(is_backward_compatible=False)
@contextmanager
def override_stack_trace():
global is_overridden
saved_is_overridden = is_overridden
try:
is_overridden = True
yield
finally:
is_overridden = saved_is_overridden
@compatibility(is_backward_compatible=False)
def set_stack_trace(stack : List[str]):
global current_stack
if is_overridden and stack:
current_stack = stack
@compatibility(is_backward_compatible=False)
@contextmanager
def append_stack_trace(stack : Optional[str]):
"""
The content of stack here is an entire stacktraces as a string
"""
global current_stack
if is_overridden and stack:
try:
current_stack.append(stack)
yield
finally:
current_stack.pop()
else:
yield
@compatibility(is_backward_compatible=False)
def format_stack() -> List[str]:
if is_overridden:
return current_stack.copy()
else:
# fallback to traceback.format_stack()
return traceback.format_stack()
@compatibility(is_backward_compatible=False)
def is_stack_trace_overridden() -> bool:
return is_overridden
|