mypy 找不到模块 'dropbox'

mypy cannot find module 'dropbox'

我有一个small codebase to back up Dropbox Business files, and am trying to use mypy to help me use the rather unpythonic Dropbox Python SDK.

我已经安装了 mypy,它正在运行。

但是,mypy 对以下行发出警告:

import dropbox

警告是"Cannot find module named 'dropbox'"。

Dropbox 的 SDK 生成器 Stone 似乎应该 generate compatible stub files(在本例中应称为 dropbox.pyi)。

但是 site-packages/dropbox 中没有 dropbox.pyi,mypy 会在那里寻找它。

如何让 dropbox 包的类型检查正常工作?

提前致谢。

版本:

我不熟悉 Dropbox API,但我的印象是,如果用户想要存根,则用户要对 运行 你找到的那个文件负责。

在撰写本文时,您有两个选择:

  1. 将您生成的存根复制到某个文件夹并设置 MYPYPATH 环境变量以指向该文件夹。 (将存根存储在 site-packages 中 + 设置 MYPYPATH 以指向整个 site-packages 文件夹可能不是一个好主意,因为当 mypy 尝试解析时你会收到很多虚假的错误消息完全未类型化的包。)

    我的建议是对项目中生成的存根进行版本控制,并设置构建过程以在必要时自动设置该环境变量。

  2. 将包含这些存根的拉取请求提交到 typeshed,各种类型检查器(包括 mypy)使用的类型存根存储库。您首先需要获得 Dropbox 开发人员的许可 API 才能包含存根。

    (我怀疑他们可能会同意,除非 API 仍处于 alpha/beta 状态并且很可能会发生变化)。

Dropbox Python SDK 不包含 .pyi 文件作为 Dropbox Python SDK 的一部分,因此您必须构建它们并设置 MYPYPATH

从 Dropbox API 规范执行此操作:

# We first need the Dropbox stone and public stone specs:
git clone git@github.com:dropbox/stone.git
git clone git@github.com:dropbox/dropbox-api-spec.git

# Next we need to install ply (used for running stone)
pip install ply

# Use stone to build the type stubs
PYTHONPATH=stone python -m stone.cli python_type_stubs mypy_stubs/dropbox dropbox-api-spec/*.stone

# include __init__.py files
touch mypy_stubs/__init__.py mypy_stubs/dropbox/__init__.py

# now mypy succeeds when using MYPYPATH to reference new .pyi files
MYPYPATH=mypy_stubs mypy project.py

或者,您可以从 Dropbox Python SDK 构建存根:

# This assumes the following python modules are already installed: six, ply
git clone git@github.com:dropbox/dropbox-sdk-python.git
cd dropbox-sdk-python/
git submodule init
git submodule update
PYTHONPATH=./stone python -m stone.cli python_type_stubs mypy_stubs/dropbox spec/*.stone