False Unused Import Statement in PyCharm?

PythonPycharm

Python Problem Overview


Given this scenario:

b.py:

import A
# A is unused here

c.py:

from b import A
# A is used here

PyCharm complains in b.py that import A is an unused import and Optimize imports deletes it, breaking import in c.py.

I know these chained imports are not a good practice (although you may use it to implement a facade module), but is it me or is it a PyCharm fail?

Python Solutions


Solution 1 - Python

You can actually use the PyUnresolvedReferences marker to deactivate the inspection for your import statement:

# noinspection PyUnresolvedReferences
import A

Reference: PyCharm bug PY-2240

Solution 2 - Python

As far as I can tell this behaviour is not handled as an inspection or some other configurable option, which means there is no #noinspection UnusedImport (or equivalent) that can be placed before the imports.

If you don't want to define an unused block where you use those variables there's an other simple and probably better way to achieve what you want:

#b.py code
import A

# [...] your code


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

PyCharm is smart enough to look at __all__ and avoid removing A as unused import. However there's a limitation that __all__ must be a simple list literal. You cannot do things like:

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

Not even:

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

Defining __all__ is a best-practice to make your module *-import safe anyway, so is something you should already do.

Solution 3 - Python

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

Works for me. I don't like

# noinspection PyUnresolvedReferences

as it would give false negatives in case A cannot be imported. And

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

is cryptic and is not convenient for refactoring.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMihnea SimianView Question on Stackoverflow
Solution 1 - PythonbenselmeView Answer on Stackoverflow
Solution 2 - PythonBakuriuView Answer on Stackoverflow
Solution 3 - PythonPeter ZagubisaloView Answer on Stackoverflow