修掉合并带入的 3 个 mypy 错(全在袁聪的场外邮件模块,各一行、不动逻辑)

1. offsite_document_recognition_adapter.py:788 —— 冗余 cast。
   `value in ("summary", ...)` 已经把类型收窄到那个字面量联合,cast 多余,删掉即可。
   该文件另有 13 处 cast,删这一个不影响 import。

2. offsite_fund_service.py:1203 —— dict 不变型。
   字面量里只有一个 bool,mypy 推断成 dict[str, bool | None],而 dict 是**不变型**,
   不是 dict[str, object] 的子类型。运行时本来就是合法值,加一行显式标注即可。

3. offsite_fund_service.py:1240 —— 标注宽于实际。
   `get_content()` 只定义在 EmailMessage 上,而调用方传的是
   BytesParser(policy=policy.default).parsebytes(...) 的返回值(本来就是 EmailMessage)。
   形参从基类 Message 改成 EmailMessage;import 同步替换(Message 仅此一处使用)。

三条都不影响运行:tests/unit/worker/test_offsite_mail_worker.py 的 6 个用例覆盖的正是
这条路径,修前修后都通过。修的意义在于——strict=true 下留着这 3 个错,mypy 在这个文件上
就失去价值,而 offsite_* 是刚合并进来、最需要类型检查兜底的新域。

验证:mypy 163 文件 0 错 / ruff 干净 / unit+contract 810 passed / integration 76 passed。

(另:本机 pytest 默认 basetemp 被权限占住的问题仍在,用重定向 TEMP 绕开,注意先建目录;
NL_develop 的 conftest 修复合并后可根治。)
This commit is contained in:
2026-09-11 20:15:17 +08:00
parent f60915b70b
commit b5b068065f
2 changed files with 11 additions and 4 deletions
@@ -785,7 +785,8 @@ def _confidence_map(value: Mapping[str, object]) -> dict[str, Decimal]:
def _document_type(value: object) -> DocumentType:
if value in ("summary", "subscription", "redemption", "other"):
return cast(DocumentType, value)
# 不需要 cast:上面的 `in (...)` 已经把类型收窄到那个字面量联合了。
return value
return "other"
+9 -3
View File
@@ -7,7 +7,7 @@ from datetime import UTC, date, datetime
from decimal import Decimal
from email import policy
from email.header import decode_header, make_header
from email.message import Message
from email.message import EmailMessage
from email.parser import BytesParser
from email.utils import parsedate_to_datetime
from pathlib import Path
@@ -1190,7 +1190,10 @@ class OffsiteFundService:
@staticmethod
def _parse_eml(path: str) -> dict[str, object]:
empty = {
# 显式标注:字面量里只有一个 bool,mypy 会把它推断成 `dict[str, bool | None]`,
# 而 dict 是**不变型**,`dict[str, bool | None]` 不是 `dict[str, object]` 的子类型。
# 运行时本来就是合法值,缺的只是这一个标注。
empty: dict[str, object] = {
"subject": None,
"sent_at": None,
"has_body": False,
@@ -1227,8 +1230,11 @@ class OffsiteFundService:
except (LookupError, UnicodeError, ValueError):
return value
# 形参标注用 EmailMessage 而不是基类 Message:`get_content()` 只定义在 EmailMessage 上,
# 而调用方传的是 `BytesParser(policy=policy.default).parsebytes(...)` 的返回值 ——
# 它本来就是 EmailMessage。原先标注成基类,mypy 于是在下面报"没有该属性"。
@staticmethod
def _mail_body(message: Message) -> tuple[str | None, str | None]:
def _mail_body(message: EmailMessage) -> tuple[str | None, str | None]:
text_body: str | None = None
html_body: str | None = None
parts = message.walk() if message.is_multipart() else (message,)