修改日志/细节问题

This commit is contained in:
xinzhu.yin
2026-04-21 16:03:11 +08:00
parent e27312d0a3
commit 9a2ac69afb
14 changed files with 230 additions and 144 deletions

View File

@@ -414,6 +414,122 @@ class PQResult:
}
class PQResultStore:
"""按 test_type 管理多个 PQResult 实例。
解决两个问题:
1. `self.results` 在测试流程启动前就存在(避免 AttributeError / NoneType 访问)。
2. 支持同时保留多种 test_typescreen_module / sdr_movie / hdr_movie的历史结果
而不是每次启动新测试就把上一次的结果覆盖掉。
使用方式:
# 主类 __init__ 中:
self.results = PQResultStore()
# 启动一次新测试时:
self.results.new("screen_module", "屏模组性能测试")
# 现有调用点(隐式访问当前活跃结果)仍然生效:
self.results.add_intermediate_data("gamut", "rgb", data)
self.results.get_intermediate_data("shared", "gray")
# 跨类型显式访问某次历史结果:
pq = self.results.get("sdr_movie")
if pq is not None:
data = pq.get_intermediate_data("gamut", "rgb")
"""
# __getattr__ 代理时,这些方法若在无活跃结果时被调用,返回 None 而不是报错,
# 以兼容"尝试读取但数据还没来"的场景。
_SAFE_GETTERS = frozenset({
"get_intermediate_data",
"has_intermediate_data",
"get_all_intermediate_data",
"get_test_summary",
"get_progress_info",
"to_dict",
})
def __init__(self):
self._results: Dict[str, PQResult] = {}
self._active_type: Optional[str] = None
# ---------- 显式 API ----------
def new(self, test_type: str, test_name: str) -> PQResult:
"""为指定 test_type 创建新的 PQResult并置为当前活跃。
若该 test_type 已有旧结果,会被替换。
"""
result = PQResult(test_type=test_type, test_name=test_name)
self._results[test_type] = result
self._active_type = test_type
return result
def get(self, test_type: str) -> Optional[PQResult]:
"""按 test_type 取结果;不存在则返回 None。"""
return self._results.get(test_type)
def has(self, test_type: str) -> bool:
"""判断某个 test_type 是否有结果。"""
return test_type in self._results
def set_active(self, test_type: str) -> bool:
"""切换当前活跃结果。成功返回 True。"""
if test_type in self._results:
self._active_type = test_type
return True
return False
def clear(self, test_type: Optional[str] = None) -> None:
"""清空结果。不传参数清全部,否则只清指定 test_type。"""
if test_type is None:
self._results.clear()
self._active_type = None
else:
self._results.pop(test_type, None)
if self._active_type == test_type:
self._active_type = None
@property
def current(self) -> Optional[PQResult]:
"""当前活跃的 PQResult无则返回 None。"""
if self._active_type is None:
return None
return self._results.get(self._active_type)
@property
def current_test_type(self) -> Optional[str]:
return self._active_type
@property
def all_types(self) -> List[str]:
return list(self._results.keys())
# ---------- 兼容性:透明代理到 current ----------
def __bool__(self) -> bool:
"""`if self.results:` 仍可用于判断当前是否有活跃结果。"""
return self.current is not None
def __getattr__(self, name: str) -> Any:
# 只有常规属性查找失败时才会走到这里
if name.startswith("_"):
raise AttributeError(name)
current = self.current
if current is not None:
return getattr(current, name)
# 无活跃结果:读类方法返回空值 stub写类方法抛出清晰错误
if name in self._SAFE_GETTERS:
def _null_getter(*_args, **_kwargs):
return None
return _null_getter
raise AttributeError(
f"PQResultStore 当前没有活跃的 PQResult还未调用 new()"
f"无法访问 '{name}'。如需按 test_type 取历史结果,请用 .get(test_type)。"
)
# 使用示例和工具函数
def create_pq_result_from_config(config: Dict[str, Any]) -> PQResult:
"""根据配置创建PQResult实例"""