修改日志/细节问题
This commit is contained in:
@@ -414,6 +414,122 @@ class PQResult:
|
||||
}
|
||||
|
||||
|
||||
class PQResultStore:
|
||||
"""按 test_type 管理多个 PQResult 实例。
|
||||
|
||||
解决两个问题:
|
||||
1. `self.results` 在测试流程启动前就存在(避免 AttributeError / NoneType 访问)。
|
||||
2. 支持同时保留多种 test_type(screen_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实例"""
|
||||
|
||||
Reference in New Issue
Block a user