【问题标题】:mypy cannot find module 'dropbox'mypy 找不到模块“保管箱”
【发布时间】:2018-01-06 17:46:08
【问题描述】:

我有一个small codebase to back up Dropbox Business files,并且正在尝试使用mypy 来帮助我使用相当不符合python 的Dropbox Python SDK

我已经安装了 mypy,它正在工作。

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

import dropbox

警告是“找不到名为 'dropbox' 的模块”。

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

但是site-packages/dropbox 中没有dropbox.pyi,mypy 会在其中查找它。

如何对 dropbox 包进行类型检查?

提前致谢。

版本:

  • Python 3.6 64 位 (Anaconda)
  • 操作系统:Windows 10 专业版 64 位
  • mypy 0.521
  • Dropbox SDK 8.0.0

【问题讨论】:

    标签: python types dropbox-api mypy dropbox-sdk


    【解决方案1】:

    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
    

    【讨论】:

    • SDK API 已经有一段时间了,所以看起来很稳定。 Dropbox 的某个人是否有任何理由不将存根添加到 typeshed 存储库中?如果这很麻烦,我应该添加存根吗?
    • 我不知道有没有什么特别的原因,但我会要求团队这样做。
    • 非常感谢。如果您听说存根被添加到 typeshed 中,请在上面的答案中注明
    【解决方案2】:

    我不熟悉 Dropbox API,但我得到的印象是,如果用户需要存根,则需要负责运行您找到的文件。

    完成此操作后,截至撰写本文时,您有两种选择:

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

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

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

      (我怀疑他们可能会说是,除非 API 仍处于 alpha/beta 状态并且容易更改)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多