"""报告和一致预期分支独立处理;空预期不变零、不生成冒牌市场均值。""" import json from decimal import Decimal as D, InvalidOperation def finite(value): try: parsed = D(str(value)) except (InvalidOperation, ValueError): return None return parsed if parsed.is_finite() else None def packet_result(packet, price="20", year=2027): quote = finite(price) if quote is None or quote <= 0: raise ValueError("invalid_quote") if packet.get("ok") is not True: return {"status": "tool_failed", "reports": [], "blocked": ["all_calculations"], "error": packet.get("error", "unspecified_tool_error")} data = packet.get("data") if not isinstance(data, dict): raise ValueError("invalid_envelope_data") raw_reports, raw_consensus = data.get("reports"), data.get("consensus_eps") if not isinstance(raw_reports, list): raise ValueError("invalid_reports_shape") reports = [] for row in raw_reports: result = {"report_id": row["id"], "broker": row["broker"], "year": row["year"], "source": row["source"], "forward_pe": None} eps = finite(row.get("eps")) if row["year"] != year: result["status"] = "wrong_year" elif row.get("currency") != "CNY" or row.get("basis") != "diluted": result["status"] = "incompatible_context" elif eps is None: result["status"] = "missing_or_nonfinite_eps" elif eps <= 0: result["status"] = "nonpositive_eps" else: result.update(status="calculated_broker_only", eps=str(eps), forward_pe=str(quote / eps)) reports.append(result) # 本例仅验证缺失分支,不从“有一个值”推断供应商覆盖范围已经核实。 if raw_consensus is None: consensus_status = "missing_block" elif not isinstance(raw_consensus, list): consensus_status = "invalid_block_shape" elif not raw_consensus: consensus_status = "empty_cause_unverified" else: consensus_status = "requires_separate_provider_context_check" return {"status": "partial" if reports else "no_usable_report_rows", "reports": reports, "consensus_status": consensus_status, "market_consensus_eps": None, "consensus_pe": None, "blocked": ["market_consensus_eps", "consensus_pe", "earnings_surprise_vs_consensus"], "report_mean_substituted": False} report = {"id": "r1", "broker": "B1", "year": 2027, "currency": "CNY", "basis": "diluted", "eps": "1.2", "source": "synthetic-report-r1"} packet = {"ok": True, "data": {"reports": [report, {**report, "id": "r2", "broker": "B2", "eps": "1.4", "source": "synthetic-report-r2"}], "consensus_eps": []}} partial = packet_result(packet) assert partial["status"] == "partial" and len(partial["reports"]) == 2 assert D(partial["reports"][0]["forward_pe"]) == D(20) / D("1.2") assert D(partial["reports"][1]["forward_pe"]) == D(20) / D("1.4") assert partial["market_consensus_eps"] is None and partial["consensus_pe"] is None assert partial["consensus_status"] == "empty_cause_unverified" and not partial["report_mean_substituted"] bad = packet_result({"ok": True, "data": {"reports": [{**report, "eps": "NaN"}, {**report, "id": "zero", "eps": "0"}], "consensus_eps": {}}}) assert [r["status"] for r in bad["reports"]] == ["missing_or_nonfinite_eps", "nonpositive_eps"] assert all(r["forward_pe"] is None for r in bad["reports"]) assert bad["consensus_status"] == "invalid_block_shape" failed = packet_result({"ok": False, "error": "synthetic_fetch_failure"}) assert failed["status"] == "tool_failed" and failed["reports"] == [] zero_coverage = packet_result({"ok": True, "data": {"reports": [], "consensus_eps": []}}) assert zero_coverage["status"] == "no_usable_report_rows" print(json.dumps({"partial": partial, "invalid_values": bad, "outer_failure": failed, "empty": zero_coverage}, sort_keys=True))