#python #pycharm #python-3.6 #pep #pyi
#python #pycharm #python-3.6 #бодрость духа #pyi
Вопрос:
Я хотел бы ввести аннотацию частичного типа в свой проект. Например, для перегрузки. Я обнаружил, что в pep561 введена частичная поддержка файлов-заглушек.
Я разрабатываю свой проект с помощью PyCharm и добавляю соответствующий *.pyi
файл. И получил ожидаемую информацию, но PyCharm сообщает, что не может найти ссылку в файле pyi.
Можно ли заставить PyCharm искать исходный py-файл, когда в 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?