Я пытаюсь ввести намек на класс 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 способ разрешения этого предупреждения?






Происходит это потому, что по какой-то странной причине класс Process не включен в список asyncio.subprocess.__all__.
Когда модуль определяет определенный список __all__, и вы импортируете имена из этого модуля, которые не отображаются в этом списке, PyCharm выдает предупреждение, поскольку считает, что это похоже на импорт защищенных имен (начиная с одного подчеркивания _).
Так как PY-8656 PyCharm поддерживает директивы noqa, используемые flake8 для исключения строки из проверки линтера.
Поэтому самое простое решение — просто добавить такую директиву в строку импорта:
from asyncio.subprocess import Process # noqa
process: Process
...
Это не влияет на подсказки типа с Process. Он по-прежнему распознается как тип любым средством проверки типов, а его (общедоступные) методы по-прежнему открыты и известны.
@SUTerliakov Возможно. Но я так не думаю. Он задокументирован как обычный класс, и нигде даже не упоминается, что его нельзя создавать напрямую. Более того, если вы используете низкоуровневый API, может быть даже полезно создать его подкласс. Честно говоря, я не вижу причин исключать его из __all__, даже если сопровождающие намеревались использовать его просто как подсказку типа. Но это только мое мнение.
Хм, ладно, создание подклассов, безусловно, имеет смысл. Тогда как вы думаете - стоит ли выпускать на питоновском гитхабе?
Я думал об этом, но это такая мелкая проблема, и есть так много более важных дел, что я не хотел бы загромождать проблемы. Не говоря уже о том, что все линтеры, которые я пробовал (flake8, pylint, ruff и т. д.), не выдают предупреждение/ошибку при импорте чего-то, чего нет в __all__. Насколько я вижу, об этом предупреждает только PyCharm. Во всяком случае, я бы сказал, что PyCharm здесь слишком осторожен. На самом деле, единственная релевантность __all__ в любом случае — это *-импорт. Не для того, чтобы пометить что-то как общедоступное/защищенное.
Бьюсь об заклад, его нет в
__all__, потому что он не предназначен для прямого создания экземпляра и в основном полезен как подсказка типа.