Упаковочные заглушки

Скажем, у меня очень простой пакет со следующей структурой:

.
├── foo
│   ├── bar
│   │   └── __init__.py
│   └── __init__.py
└── setup.py

Содержимое файлов:

  • setup.py:

    from distutils.core import setup
    
    setup(
        name='foobar',
        version='',
        packages=['foo', 'foo.bar'],
        url='',
        license='Apache License 2.0',
        author='foobar',
        author_email='',
        description=''
    )
    
  • foo/bar/__init__.py:

    def foobar(x):
        return x
    
  • Остальные файлы пустые.

Я устанавливаю пакет с помощью pip:

cd foobar
pip install .

и может подтвердить, что он установлен правильно.

Теперь я хочу создать отдельный пакет с заглушками:

.
├── foo
│   ├── bar
│   │   └── __init__.pyi
│   └── __init__.pyi
└── setup.py

Содержимое файлов:

  • setup.py:

    from distutils.core import setup
    import sys
    import pathlib
    
    setup(
        name='foobar_annot',
        version='',
        packages=['foo', 'foo.bar'],
        url='',
        license='Apache License 2.0',
        author='foobar',
        author_email='',
        description='',
        data_files=[
            (
                'shared/typehints/python{}.{}/foo/bar'.format(*sys.version_info[:2]),
                ["foo/bar/__init__.pyi"]
            ),
        ],
    )
    
  • foo.bar.__init__.pyi:

    def foobar(x: int) -> int: ...
    

Я могу установить этот пакет, увидеть, что он создает anaconda3/shared/typehints/python3.5/foo/bar/__init__.pyi в моем корневом каталоге Anaconda, но не похоже, что он распознан PyCharm (я не получаю никаких предупреждений). Когда я помещаю pyi файл в основной пакет, все работает нормально.

Буду благодарен за любые подсказки, как сделать эту работу:

Некоторые вещи, которые работают, но не решают проблему:

  • Включение файлов-заглушек в текущий проект и маркировка в качестве источников.
  • Добавление корня заглушки в путь интерпретатора (по крайней мере, в некоторых простых случаях).

Итак, вопросы: Как создать минимальный дистрибутивный пакет с заглушками Python, который будет распознаваться существующими инструментами. На основании экспериментов я подозреваю одну из двух проблем:

  • Я неправильно понял структуру, которая должна быть создана пакетом в shared/typehints/pythonX.Y - если это так, как мне определить data_files?
  • PyCharm не рассматривает эти файлы вообще (это, кажется, противоречит некоторым комментариям в связанной проблеме).
  • Предположим, что все работает нормально, но я допустил некоторую ошибку конфигурации и искал внешнюю проблему, которая не существует.
  • Существуют ли установленные процедуры для устранения таких проблем?

Ответы

Ответ 1

Проблема заключается в том, что вы не включили файл foo/__init__.pyi в свой дистрибутив. Несмотря на то, что он пуст, он делает foo пакет заглушек и включает поиск foo.bar.

Вы можете изменить data_files в своем setup.py, чтобы включить оба

data_files=[
    (
        'shared/typehints/python{}.{}/foo/bar'.format(*sys.version_info[:2]),
        ["foo/bar/__init__.pyi"]
    ),

    (
        'shared/typehints/python{}.{}/foo'.format(*sys.version_info[:2]),
        ["foo/__init__.pyi"]
    ),
],