2017-01-28 13 views
18

Скажем, у меня есть очень простой пакет со следующей структурой:упаковки файлов заглушки

. 
├── 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 в моем корне Анаконда, но это не выглядит, как она признается PyCharm (я не получаю никаких предупреждений). Когда я помещаю pyi файл в основной пакет, все работает нормально.

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

  • Я пытался сделать какой-то смысл от PEP 484 - Storing and distributing stub files, но безрезультатно. Даже pathlib часть кажется оскорбительной моей версии distutils
  • PY-18597 и https://github.com/python/mypy/issues/1190#issuecomment-188526651, похоже, связаны, но почему-то я не могу подключить точки.
  • Я попытался поместить штыри в .PyCharmX.X/config/python-skeletons, но это не помогло.

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

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

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

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

Какой PyCharm версию и какую ОС? – fedepad

ответ

2

Проблема в том, что вы не указали файл 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"] 
    ), 
],