修掉合并带入的 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:
@@ -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"
|
||||
|
||||
|
||||
|
||||
@@ -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,)
|
||||
|
||||
Reference in New Issue
Block a user