ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

mypy 如何配置 mypy_path 让多个项目共用同一套类型存根?

mypy 如何配置 mypy_path 让多个项目共用同一套类型存根? mypy 如何配置 mypy_path 让多个项目共用同一套类型存根【免费下载链接】mypyOptional static typing for Python项目地址: https://gitcode.com/GitHub_Trending/my/mypy当你有多个 Python 项目引用同一批尚未经过正式发布的内部库或者你正为某个没有类型标注的第三方库编写自己的.pyi存根时在每个项目里各放一份存根、各配一份 mypy 设置很快会变得难以维护。mypy 的mypy_path配置项和MYPYPATH环境变量正是为这种情况设计的官方文档明确指出如果多个项目碰巧使用同一套进行中的存根把MYPYPATH指向一个包含这些存根的唯一目录会非常方便见 running_mypy.rst。配置完成后各项目的 mypy 都能在同一套存根上做类型检查存根的修改对所有项目即时生效。先准备一个共享的存根目录mypy 在解析import时会在搜索路径中依次查找名为foo的包包含__init__.py或__init__.pyi的目录、存根文件foo.pyi、Python 模块foo.py同目录下.pyi优先于.py。因此共享存根目录要遵守正常的 Python 命名约定见 stubs.rst模块csv的存根写成csv.pyi包则使用子目录并放入__init__.pyi。目录结构示例路径值需替换为你实际的存根目录~/work/shared-stubs/ myinternal/ __init__.pyi utils.pyi legacylib.pyi存根文件的写法与源码相同但省略运行时逻辑变量只保留注解函数体用省略号...代替例如def func_1(code: str) - int: ...存根不必覆盖整个库可以先用 mypy 自带的stubgen生成初稿再迭代补齐实际用到的部分。在 mypy 配置文件中设置 mypy_path把存根目录写进 mypy 配置文件后每个项目无需再导出环境变量。mypy 按优先级依次查找mypy.ini、.mypy.ini、pyproject.toml含[tool.mypy]段、setup.cfg含[mypy]段也可以用--config-file指定具体文件见 config_file.rst。mypy_path的关键规则多个路径之间用:或,分隔与平台无关支持~和环境变量展开相对路径相对于运行 mypy 命令的工作目录而不是相对于配置文件要表达相对于配置文件的路径用MYPY_CONFIG_FILE_DIR环境变量例如mypy_path $MYPY_CONFIG_FILE_DIR/src只能在配置文件的[mypy]全局段中设置在 Windows 上避免用:分隔符改用 UNC 路径如\\127.0.0.1\X$\MyDir。在mypy.ini中[mypy] mypy_path ~/work/shared-stubs多个存根目录时可以并列[mypy] mypy_path ~/work/shared-stubs:~/work/more-stubs如果项目使用pyproject.toml[mypy]段对应[tool.mypy]段写法为[tool.mypy] mypy_path ~/work/shared-stubs替代方案使用 MYPYPATH 环境变量不想改配置文件时可以直接设置MYPYPATH环境变量指向存根目录文档示例$ export MYPYPATH~/work/myproject/stubs路径分隔符与mypy_path不同UNIX 系统用冒号:分隔Windows 用分号;。两者的优先级是固定的mypy 的模块搜索路径依次来自MYPYPATH环境变量、mypy_path配置项、命令行给出的源文件所在目录、标记为可类型检查的已安装包PEP 561、typeshed 相关目录。也就是说MYPYPATH中的路径会先于配置文件中的mypy_path被尝试。验证配置生效未配置时导入存根对应的模块会报出这类错误文档示例main.py:3: error: Cannot find implementation or library stub for module named this_module_does_not_existmypy 遇到无法跟踪的导入会将其视为动态类型Any后续任何属性访问都会自动通过类型检查因此失去作用。配置mypy_path或MYPYPATH后重新运行 mypy判断标准是上述Cannot find implementation or library stub错误消失导入语句不再被跳过存根中标注的类型开始参与检查——对存根中声明为int的返回值做错误类型赋值等操作mypy 会像对待带标注的普通模块一样报错。mypy -v会显示 mypy 将检查的文件及其关联的模块名可用于确认导入确实解析到了预期的存根模块见 running_mypy.rst。限制与常见误区stub-only 包不能通过 MYPYPATH 引用。PEP 561 的 stub-only 包如foo-stubs必须实际安装mypy 无法通过MYPYPATH指向它见 installed_packages.rst。共享目录里放的是你自己管理的.pyi文件这条限制不影响本方案但不要把已发布的 stub 包目录直接塞进搜索路径。不要把 MYPYPATH 指向标准库或 site-packages。官方文档明确警告这是几乎总是坏主意你会得到大量来自未编写代码的错误信息mypy 甚至可能因第三方包中未预期的语法构造而崩溃。如果导入的目标是某个包的子模块mypy_path/MYPYPATH要指向包含整个包的目录而不是子模块所在目录。配置完成并验证无误后后续修改共享存根目录中的任何.pyi文件所有引用它的项目在下次运行 mypy 时都会使用新版本无需逐项目调整。【免费下载链接】mypyOptional static typing for Python项目地址: https://gitcode.com/GitHub_Trending/my/mypy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表