@@ -31,6 +31,9 @@ def _load_results(path: Path) -> dict:
3131 return json .load (f )
3232
3333
34+ _MISSING = object ()
35+
36+
3437def _safe_get (data : dict , * keys , default = None ):
3538 """Safely traverse nested dict keys."""
3639 current = data
@@ -44,11 +47,13 @@ def _safe_get(data: dict, *keys, default=None):
4447
4548def _quality_metric (data : dict , * keys , default = None ):
4649 """Read a quality metric from nested results.json layouts."""
47- value = _safe_get (data , "quality" , * keys , default = default )
48- if value is not default :
50+ value = _safe_get (data , "quality" , * keys , default = _MISSING )
51+ if value is not _MISSING :
4952 return value
5053
51- quality = data .get ("quality" , {})
54+ quality = data .get ("quality" )
55+ if not isinstance (quality , dict ):
56+ return default
5257 if len (keys ) == 1 :
5358 return quality .get (keys [0 ], default )
5459 if keys [0 ] == "pairwise" and len (keys ) == 2 :
@@ -131,8 +136,10 @@ def _add(category, metric, val_a, val_b, unit="", lower_is_better=True):
131136 val_b = _quality_metric (run_b , "absolute_scores" , metric_key )
132137 _add ("Quality" , metric_key , val_a , val_b , "" , lower_is_better = False )
133138
134- cat_a = _safe_get (run_a , "quality" , "win_rate_by_category" , default = {}) or {}
135- cat_b = _safe_get (run_b , "quality" , "win_rate_by_category" , default = {}) or {}
139+ _cat_a = _safe_get (run_a , "quality" , "win_rate_by_category" )
140+ cat_a = _cat_a if isinstance (_cat_a , dict ) else {}
141+ _cat_b = _safe_get (run_b , "quality" , "win_rate_by_category" )
142+ cat_b = _cat_b if isinstance (_cat_b , dict ) else {}
136143 for category in sorted (set (cat_a ) | set (cat_b )):
137144 for metric_key in ["router_win_rate" , "baseline_win_rate" , "tie_rate" ]:
138145 val_a = _safe_get (cat_a .get (category , {}), metric_key )
0 commit comments