Частичная заглушка в PyCharm

#python #pycharm #python-3.6 #pep #pyi

#python #pycharm #python-3.6 #бодрость духа #pyi

Вопрос:

Я хотел бы ввести аннотацию частичного типа в свой проект. Например, для перегрузки. Я обнаружил, что в pep561 введена частичная поддержка файлов-заглушек.

Я разрабатываю свой проект с помощью PyCharm и добавляю соответствующий *.pyi файл. И получил ожидаемую информацию, но PyCharm сообщает, что не может найти ссылку в файле pyi.

Можно ли заставить PyCharm искать исходный py-файл, когда в pyi-файле нет записи? Или, может быть, это также выполнимо с частичной записью для класса?

Я создаю пример проекта, чтобы показать проблему (оригинал слишком большой): не удается найти ссылку 'CC' в '__init__.pyi'

 ├── main.py
└── pep561_test
    ├── __init__.py
    └── __init__.pyi
  

main.py

 from pep561_test import AA, BB, CC

AA().test1(1)
AA().test1(True)
AA().test1('a')
AA().test2(1)

BB().test1(1)
BB().test2(1)
  

__init__.py

 class AA:
    def test1(self, a):
        pass

    def test2(self, a):
        pass


class BB:
    def test1(self, a):
        pass

    def test2(self, a):
        pass


class CC:
    def test1(self, a):
        pass

    def test2(self, a):
        pass
  

__init__.pyi

 class AA:
    def test1(self, a: int) -> int: ...

    def test1(self, a: bool) -> str: ...

    def test2(self, a):
        pass


class BB:
    def test1(self, a):
        pass
  

Комментарии:

1. Я не думаю, что возможно объединить определения из py и pyi заглушки для одного и того же файла из PEP 561: «Это можно рассматривать как функциональный эквивалент копирования заглушки в тот же каталог, что и соответствующий пакет среды выполнения … и введите проверку объединенной структуры каталогов». Этот способ __init__.pyi переопределит __init__.py . mypy не могу сделать это так же хорошо, как PyCharm: main.py:1: error: Module 'pep561_test' has no attribute 'CC'

2. Почему вы не можете добавить подсказки типа в свой обычный py файл?

3. Это решение, которое я использую, когда задаю эти вопросы. Главное, почему я предпочитаю использовать отдельный файл, — это сохранение чистого кода. Когда я пишу этот вопрос, мне также нужно использовать # noinspection PyOverloads при добавлении аннотаций типов для автоматически созданных методов..

4. К вашему сведению: я создал соответствующую проблему youtrack.jetbrains.com/issue/PY-46104

Ответ №1:

Указание на поиск в .py отсутствующей ссылки верхнего уровня (CC)

Согласно PEP 484, это возможно, просто добавьте следующую строку на верхнем уровне вашего .pyi (я проверил, что это работает с PyCharm 11.0.7, РЕДАКТИРОВАТЬ: не работает в PyCharm 2020.3):

 def __getattr__(name) -> Any: ...
  

Указание на поиск в .py отсутствующего атрибута / метода (BB)

Другие библиотеки (по крайней мере, машинописные) допускают аналогичный синтаксис для объединения неполной заглушки класса с определением класса в .py

 class Foo:
    def __getattr__(self, name: str) -> Any: ...  # incomplete
    x: int
    y: str
  

Однако, похоже, это не является частью PEP 484 и, насколько я знаю, не реализовано в PyCharm (начиная с 11.0.7). Я только что создал запрос на эту функцию: я наткнулся на этот вопрос stackoverflow, когда искал способ объединить мою незавершенную заглушку класса с определением класса и пришел к выводу, что это пока невозможно.

Комментарии:

1. У меня это не работает в PyCharm 2020.3

2. Спасибо за отзыв. Я только что протестировал это (на случай, если вы допустили ошибку или что-то было не так в вашей конкретной конфигурации PyCharm). Но я подтверждаю, что приведенное выше предложение не работает в PyCharm 2020.3, я оставляю его, поскольку это должно быть решением (это часть PEP 484) и может быть исправлено в будущей версии PyCharm.

3. спасибо за подтверждение! Вы знаете, в какой версии Pycharm это работало, в обозначении year.month?