class BasePerfRecorder: def record(self, name, value, unit): pass def log(self, msg): pass class PerfRecorder(BasePerfRecorder): def record(self, name, value, unit): print(f"perf: {name}={value} {unit}") def log(self, msg): print(msg) class JSONPerfRecorder(BasePerfRecorder): def __init__(self): super().__init__() self.recs = {} self.logs = [] def record(self, name, value, unit): assert isinstance(name, str) assert isinstance(value, (int, float, str)) assert isinstance(unit, str) self.recs[name] = {"value": value, "unit": unit} def log(self, msg): assert isinstance(msg, str) self.logs.append(msg) def to_object(self): return {"records": self.recs, "logs": self.logs}