mypy не может найти модуль dropbox

У меня есть небольшая база кода для резервного копирования файлов Dropbox Business, и я пытаюсь использовать mypy, чтобы помочь мне использовать довольно непривычный Dropbox Python SDK.

Я установил mypy, и он работает.

Однако mypy выдает предупреждение для следующей строки:

import dropbox

Предупреждение: «Не удается найти модуль с именем 'dropbox'».

Похоже, что генератор SDK Dropbox, называемый Stone, должен генерировать совместимую заглушку файлы (которые в данном случае будут называться dropbox.pyi).

Но нет dropbox.pyi в site-packages/dropbox, где mypy искал бы его.

Как я могу заставить работать проверку типов для пакета dropbox?

Заранее спасибо.

Версии:

  • 64-разрядная версия Python 3.6 (Anaconda)
  • ОС: Windows 10 Pro 64-разрядная
  • mypy 0.521
  • Dropbox SDK 8.0.0

person blokeley    schedule 31.07.2017    source источник


Ответы (2)


Dropbox Python SDK не включает файлы .pyi как часть Dropbox Python SDK, поэтому вам придется создать их и установить MYPYPATH.

Для этого из спецификации Dropbox API:

# We first need the Dropbox stone and public stone specs:
git clone [email protected]:dropbox/stone.git
git clone [email protected]: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 [email protected]: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
person Greg    schedule 02.08.2017
comment
SDK API некоторое время оставался неизменным, поэтому выглядит стабильным. Есть ли причина, по которой кто-то в Dropbox не добавляет заглушки в типизированное репо? Если хлопоты, можно добавить заглушки? - person blokeley; 04.08.2017
comment
Не знаю, есть ли какая-то конкретная причина, но попрошу команду сделать это. - person Greg; 04.08.2017
comment
Отлично, спасибо. Если вы слышите о добавлении заглушек в машинописный текст, запишите свой ответ выше. - person blokeley; 05.08.2017

Я не знаком с API Dropbox, но у меня складывается впечатление, что пользователь несет ответственность за запуск найденного вами файла, если ему нужны заглушки.

Как только вы это сделаете, у вас будет два варианта на момент написания:

  1. Скопируйте сгенерированные вами заглушки в какую-нибудь папку и установите переменную среды MYPYPATH так, чтобы она указывала на эту папку. (Вероятно, было бы плохой идеей хранить заглушки в site-packages + set MYPYPATH, чтобы они указывали на всю вашу site-packages папку, поскольку вы получите много ложных сообщений об ошибках, когда mypy попытается проанализировать полностью нетипизированные пакеты.)

    Я рекомендую контролировать версии сгенерированных заглушек в вашем проекте и настроить процесс сборки на автоматическую установку этой переменной среды, если это необходимо.

  2. Отправьте запрос на вытягивание, содержащий эти заглушки, в typeshed, репозиторий заглушек типов, используемых различными средствами проверки типов, включая mypy. Сначала вам нужно получить разрешение от разработчиков Dropbox API на включение заглушек.

    (Я подозреваю, что они, вероятно, скажут «да», если только API все еще не находится в альфа / бета-статусе и склонен к изменениям).

person Michael0x2a    schedule 01.08.2017