Типовые подсказки для класса Process asyncio

Я пытаюсь ввести намек на класс Process, возвращаемый asyncio.create_subprocess_exec(), но получаю слабое предупреждение (доступ к защищенному члену класса или проверке модуля) в PyCharm, используя Python 3.10 в качестве интерпретатора.

Мой код:

from asyncio.subprocess import Process
...
self.process: Process = await asyncio.create_subprocess_exec(
    *run_cmd,
    stdout=asyncio.subprocess.PIPE,
)

Каков Pythonic способ разрешения этого предупреждения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Происходит это потому, что по какой-то странной причине класс Process не включен в список asyncio.subprocess.__all__.

Когда модуль определяет определенный список __all__, и вы импортируете имена из этого модуля, которые не отображаются в этом списке, PyCharm выдает предупреждение, поскольку считает, что это похоже на импорт защищенных имен (начиная с одного подчеркивания _).

Так как PY-8656 PyCharm поддерживает директивы noqa, используемые flake8 для исключения строки из проверки линтера.

Поэтому самое простое решение — просто добавить такую ​​директиву в строку импорта:

from asyncio.subprocess import Process  # noqa

process: Process
...

Это не влияет на подсказки типа с Process. Он по-прежнему распознается как тип любым средством проверки типов, а его (общедоступные) методы по-прежнему открыты и известны.

Бьюсь об заклад, его нет в __all__, потому что он не предназначен для прямого создания экземпляра и в основном полезен как подсказка типа.

SUTerliakov 07.06.2023 17:05

@SUTerliakov Возможно. Но я так не думаю. Он задокументирован как обычный класс, и нигде даже не упоминается, что его нельзя создавать напрямую. Более того, если вы используете низкоуровневый API, может быть даже полезно создать его подкласс. Честно говоря, я не вижу причин исключать его из __all__, даже если сопровождающие намеревались использовать его просто как подсказку типа. Но это только мое мнение.

Daniil Fajnberg 07.06.2023 17:21

Хм, ладно, создание подклассов, безусловно, имеет смысл. Тогда как вы думаете - стоит ли выпускать на питоновском гитхабе?

SUTerliakov 07.06.2023 17:22

Я думал об этом, но это такая мелкая проблема, и есть так много более важных дел, что я не хотел бы загромождать проблемы. Не говоря уже о том, что все линтеры, которые я пробовал (flake8, pylint, ruff и т. д.), не выдают предупреждение/ошибку при импорте чего-то, чего нет в __all__. Насколько я вижу, об этом предупреждает только PyCharm. Во всяком случае, я бы сказал, что PyCharm здесь слишком осторожен. На самом деле, единственная релевантность __all__ в любом случае — это *-импорт. Не для того, чтобы пометить что-то как общедоступное/защищенное.

Daniil Fajnberg 07.06.2023 17:54

Другие вопросы по теме