【Bug已解决】Missing library stubs or py.typed marker 解决方案
【Bug已解决】Missing library stubs or py.typed marker 解决方案一、现象长什么样你维护一个 Python 库下游用户用mypy/pyright做类型检查时关于你这个库的调用全部报缺少类型信息error Library stubs for your_lib are missing (install with pip install ...) note (or use # type ignore 来抑制) # 或 mypy --strict 下 error Skipping analyzing your_lib module is installed but missing py.typed marker或者 IDEPyCharm / VSCode里你这个库的函数没有参数提示、没有返回类型推断。最小判据触发下游对使用了你的库的项目做类型检查 / IDE 分析 现象报 missing stubs / missing py.typed类型推断失效 根因你的包没有声明自己是带类型的缺 py.typed或没提供类型存根 影响下游类型安全与开发体验受损CI 的 mypy 严格模式失败最迷惑的是你的代码明明写了类型注解下游却说没有类型信息——因为类型信息有没有写和包有没有声明自己是带类型的是两回事。二、背景PEP 561 规定一个发行到 PyPI 的包若想让下游的类型检查器mypy/pyright使用它的类型注解必须在包里包含一个名为py.typed的空标记文件并在打包时把它作为package_data包含进 wheel。原理Python 类型检查器默认不信任第三方包的类型注解历史上很多包类型不准全信会误报py.typed是包的我声明我的类型注解是可靠的请使用它们的显式信号没有py.typed类型检查器要么忽略该包的类型报 skipping analyzing要么要求单独的types-xxxstub 包。另外两种情况包是纯 Python 且有内联注解只需加py.typed即可类型检查器直接读源码注解包含 C 扩展 / 动态生成模块源码注解读不到需要提供.pyi存根文件stub并同样配py.typed指向这些 stub。bug 的根因是打包配置遗漏了py.typed标记和package_data导致 wheel 里没有这个文件下游类型检查器拒绝使用该包类型。三、根因抽象成代码示意# pyproject.toml问题所在 [build-system] requires [setuptools] [project] name your_lib # BUG没有声明 py.typed 为 package_datawheel 里不含该标记根因链条库代码有类型注解但 wheel 里没有py.typed标记类型检查器按 PEP 561 规则发现无py.typed- 拒绝使用该包类型下游mypy报 missing stubs / skipping analyzingIDE 因类型检查器给不到信息参数提示、返回类型推断失效根因是打包遗漏py.typedpackage_data。一句话wheel 缺py.typed标记且未纳入 package_data下游类型检查器拒绝使用该包类型。四、最小可运行复现用纯 Python 模拟无 py.typed 时类型检查器拒绝# repro_py_typed.py def typechecker_accepts(package_has_py_typed): if not package_has_py_typed: raise RuntimeError(missing py.typed 拒绝使用包的类型) return use package types def main(): try: typechecker_accepts(package_has_py_typedFalse) except RuntimeError as e: print(复现成功 -, e) print(typechecker_accepts(package_has_py_typedTrue)) if __name__ __main__: main()运行输出复现成功 - missing py.typed 拒绝使用包的类型 use package types无py.typed时类型检查器拒绝正是真实 bug 的抽象。五、解决方案第一层最小直接修复最小且必须的一步在包目录里放一个空的py.typed文件并在打包配置里把它作为package_data包含进 wheelyour_lib/ __init__.py core.py py.typed # 空文件PEP 561 标记pyproject.tomlsetuptools[build-system] requires [setuptools61] build-backend setuptools.build_meta [project] name your_lib version 0.1.0 [tool.setuptools.packages.find] where [.] include [your_lib*] [tool.setuptools.package-data] your_lib [py.typed] # 关键把 py.typed 打进 wheel构建后验证 wheel 内含py.typedpython -m build unzip -l dist/your_lib-0.1.0-py3-none-any.whl | grep py.typed要点py.typed是空文件仅作标记package-data确保它被纳入 wheel下游mypy立刻能用该包内联注解。六、解决方案第二层结构性改进把类型声明完整性做成发布前的自动校验CI 在构建后检查 wheel 是否含py.typed并对源码做mypy --strict自检保证发布的类型可靠# fix_layer2.py from pathlib import Path import zipfile def wheel_has_py_typed(wheel_path: str, package: str) - bool: with zipfile.ZipFile(wheel_path) as z: names z.namelist() marker f{package}/py.typed return marker in names def assert_typed_release(wheel_path, package): assert wheel_has_py_typed(wheel_path, package), \ fwheel 缺少 {package}/py.typed下游无法使用类型 # CI 用法 assert_typed_release(dist/your_lib-0.1.0-py3-none-any.whl, your_lib)并在pyproject.toml配mypy自检[tool.mypy] strict true files [your_lib]要点wheel_has_py_typed在 CI 验证标记存在缺则发布失败mypy --strict对源码自检保证发布的类型本身可靠否则下游即使有 py.typed 也会误报类型质量与是否声明双管齐下。七、解决方案第三层断言 / CI 守护写 pytest 验证py.typed 存在且被打包# test_py_typed.py import pytest import zipfile, pathlib def test_py_typed_in_wheel(): wheel pathlib.Path(dist/your_lib-0.1.0-py3-none-any.whl) if not wheel.exists(): pytest.skip(wheel 未构建) with zipfile.ZipFile(wheel) as z: assert your_lib/py.typed in z.namelist() def test_py_typed_marker_present_in_source(): marker pathlib.Path(your_lib/py.typed) assert marker.exists(), 源码树必须有 py.typed 标记文件 def test_stub_or_inline_types(): # 至少有内联注解或 .pyi 存根之一 has_pyi any(pathlib.Path(your_lib).rglob(*.pyi)) has_annotations True # 实际应扫描源码是否有注解 assert has_pyi or has_annotationsCI 一旦有人把py.typed从打包配置删掉test_py_typed_in_wheel立即变红。八、排查清单下游报 missing stubs / missing py.typed 时确认 wheel 里是否含your_lib/py.typed解压看若没有在源码树放空py.typed并在package-data声明重新python -m build验证 marker 进 wheel若包含 C 扩展 / 动态模块额外提供.pyi存根用mypy --strict对源码自检保证类型本身可靠把第七节的 pytest 接进 CI守护 py.typed 被打包下游重新pip install你的新 wheel 后类型恢复。九、小结库的类型信息下游用不上根因是 wheel 缺py.typed标记且未纳入package-data。PEP 561 规定第三方包必须显式带py.typed才能被类型检查器信任缺它则下游mypy报 missing stubs / skipping analyzingIDE 推断失效。三层层级第一层源码树放空py.typed并在package-data声明打进 wheel第二层CI 构建后校验 wheel 含py.typed并对源码mypy --strict自检第三层pytest 验证 marker 存在且被打包锁进 CI。核心教训写了类型注解 ≠ 下游能用类型。是否声明为带类型包由py.typed这个 PEP 561 标记决定。任何发布到 PyPI 的库只要希望下游享受类型安全都必须把py.typed纳入打包——这是类型生态的入场券不是可选项。

相关新闻

Python模块:内置模块functools函数工具详解

Python模块:内置模块functools函数工具详解

Python模块:内置模块functools函数工具详解一、开篇:高阶函数的工具箱 functools模块提供了处理函数和可调用对象的高阶工具。从缓存优化到偏函数,从包装保留到函数重载——它是写出优雅Python代码的秘密武器。 ⌨️ 核心功能: fr…

2026/8/2 22:52:59 阅读更多 →
Python模块:内置模块itertools迭代工具全解析

Python模块:内置模块itertools迭代工具全解析

Python模块:内置模块itertools迭代工具全解析一、开篇:迭代器的瑞士军刀 itertools是Python标准库中的"高性能迭代工具箱"——所有函数都用C实现,比手写的Python循环快得多。它提供了构建高效迭代管道的积木块:无限序列…

2026/8/2 22:52:59 阅读更多 →
SQL AI助手开发

SQL AI助手开发

1. 项目说明本项目以 MySQL 8.0 DBA 运维核心知识点为基础,结合硅基流动开源大模型 API,构建一套电商订单库智 能查询与性能调优系统。系统可接收业务自然语言自动生成合规 MySQL 查询语句,自动执行查询并输出结构化表格,依托大模…

2026/8/2 22:52:59 阅读更多 →

最新新闻

PingFangSC字体跨平台部署解决方案:现代Web应用的中文字体优化技术指南

PingFangSC字体跨平台部署解决方案:现代Web应用的中文字体优化技术指南

PingFangSC字体跨平台部署解决方案:现代Web应用的中文字体优化技术指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 当你的Web应用需要在中…

2026/8/2 23:22:17 阅读更多 →
AI眼镜独立化革命:从硬件架构到应用开发的全面解析

AI眼镜独立化革命:从硬件架构到应用开发的全面解析

1. 项目概述:AI眼镜的“单飞”革命 最近圈子里聊得最火的话题,莫过于“AI眼镜要单飞了”。这可不是什么营销噱头,而是实打实的技术拐点。过去几年,我们看到的所谓智能眼镜,本质上更像是一个“手机的第二屏幕”或者“蓝…

2026/8/2 23:22:17 阅读更多 →
OpenAI端到端语音翻译:GPT-5级推理如何将同传成本降至地板价

OpenAI端到端语音翻译:GPT-5级推理如何将同传成本降至地板价

1. 从“天价”到“地板价”:同传翻译的成本革命最近,OpenAI在语音模型领域又扔下了一颗重磅炸弹。如果你关注AI翻译,尤其是实时同声传译,那么这个消息绝对值得你停下手中的活,好好琢磨一下。简单来说,他们声…

2026/8/2 23:22:17 阅读更多 →
A-59F双声道差分输出在扩音与通话双链路的分配

A-59F双声道差分输出在扩音与通话双链路的分配

一、一个模块,两条互相冲突的链路A-59F 的定位比较特殊:它同时服务两个场景——本地扩音和全双工通话。这两件事在信号处理上的要求并不一致,甚至有冲突之处。本地扩音是把麦克风拾到的声音立刻从同一空间的扬声器放出来(喊话器、…

2026/8/2 23:21:17 阅读更多 →
如何快速生成Android应用图标:终极Android Asset Studio完整指南

如何快速生成Android应用图标:终极Android Asset Studio完整指南

如何快速生成Android应用图标:终极Android Asset Studio完整指南 【免费下载链接】AndroidAssetStudio A set of web-based tools for generating graphics and other assets that would eventually be in an Android applications res/ directory. 项目地址: htt…

2026/8/2 23:21:17 阅读更多 →
Valhalla 静态工程审阅 #012|Hertz 源码证据驱动评测【大厂开源基础设施特辑】

Valhalla 静态工程审阅 #012|Hertz 源码证据驱动评测【大厂开源基础设施特辑】

Valhalla 静态工程审阅 #012|Hertz 源码证据驱动评测【大厂开源基础设施特辑】硬核工业风技术文章,建议搭配封面图阅读。 本文基于固定 Commit 快照开展只读静态工程审阅,不代表动态安全结论;所有观测均以可复查源码证据为边界。摘…

2026/8/2 23:21:17 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →