Подтвердить что ты не робот

Неверное неиспользованное выражение об импорте в PyCharm?

Учитывая этот сценарий:

b.py:

import A
# A is unused here

c.py:

from b import A
# A is used here

PyCharm жалуется на b.py, что "import A" - это неиспользуемый импорт, а импорт Optimize удаляет его, прерывая импорт в c.py

Я знаю, что этот цепной импорт не является хорошей практикой (хотя вы можете использовать его для реализации модуля фасада), но это я или это ошибка PyCharm?

4b9b3361

Ответ 1

Насколько я могу судить, такое поведение не обрабатывается как проверка или какой-либо другой настраиваемый параметр, а это означает, что перед импортом не может быть #noinspection UnusedImport (или эквивалент).

Если вы не хотите определять неиспользуемый блок, в котором вы используете эти переменные, есть другой простой и, вероятно, лучший способ добиться того, что вы хотите:

#b.py code
import A

# [...] your code


__all__ = ['A', ...]  # *all* the names you want to export

PyCharm достаточно умен, чтобы посмотреть __all__ и не удалять A как неиспользуемый импорт. Однако существует ограничение, что __all__ должно быть простым литералом списка. Вы не можете делать такие вещи, как:

__all__ = ['A'] + [name for name in iterable if condition(name)]

Даже не:

x = 'b'
__all__ = ['A', x]

Определение __all__ - это лучший способ сделать ваш модуль * -import безопасным, так что вы уже должны это делать.

Ответ 2

Фактически вы можете использовать маркер PyUnresolvedReferences для деактивации проверки для вашего оператора импорта:

# noinspection PyUnresolvedReferences
import A

Ссылка: Ошибка PyCharm PY-2240

Ответ 3

from C import A, B
_ = (A, B); del _

У меня работает. Мне не нравится

# noinspection PyUnresolvedReferences

так как это даст ложные отрицания в случае, если А не может быть импортирован. И

__all__ = ['A', 'B', ...]

загадочен и неудобен для рефакторинга.