En jouant un peu avec les frames, j’arrive à ça : à mon avis c’est pas fail-proof…
import sys
import inspect
class _Stop(Exception):
pass
class ignore:
def __enter__(self):
self._frame = inspect.currentframe().f_back
def tracer(frame, event, arg):
if frame is self._frame and event == "opcode":
raise _Stop
self._frame.f_trace = tracer
self._frame.f_trace_opcodes = True
sys.settrace(tracer)
def __exit__(self, exc_type, exc, tb):
return exc_type is _Stop
x = 1
print(f"Before ignore(): {x}")
with ignore():
x += 1
print("Error!")
print(f"After ignore(): {x}")
Au début ça marchait pas avec les one-liner with ignore(): print("...") car il attendait un event de type line et il avait un opcode, du coup en ajoutant f_trace_opcodes = True je n’ai que des opcode en event mais je pense pas que ça marche avec tout…