web-dev-qa-db-fra.com

Fausse déclaration d'importation inutilisée dans PyCharm?

Compte tenu de ce scénario:

b.py:

import A
# A is unused here

c.py:

from b import A
# A is used here

PyCharm se plaint dans b.py que "l'importation A" est une importation inutilisée et qu'optimize les supprime, interrompant l'importation dans c.py

Je sais que ces importations chaînées ne sont pas une bonne pratique (bien que vous puissiez l'utiliser pour implémenter un module de façade), mais est-ce moi ou est-ce un échec de PyCharm?

47
Mihnea Simian

Pour autant que je sache, ce comportement est pas traité comme une inspection ou une autre option configurable, ce qui signifie qu'il n'y a pas de #noinspection UnusedImport (ou équivalent) pouvant être placé avant les importations.

Si vous ne voulez pas définir un bloc inutilisé où vous utilisez ces variables, il existe un autre moyen simple et probablement meilleur pour atteindre ce que vous voulez:

#b.py code
import A

# [...] your code


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

PyCharm est assez intelligent pour regarder __all__ et évitez de supprimer A en tant qu'importation inutilisée. Cependant, il y a une limitation que __all__ doit être un simple littéral de liste. Vous ne pouvez pas faire des choses comme:

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

Pas même:

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

Définition de __all__ est une bonne pratique pour rendre votre module *- importez de toute façon, c'est quelque chose que vous devriez déjà faire.

15
Bakuriu

Vous pouvez réellement utiliser le marqueur PyUnresolvedReferences pour désactiver l'inspection de votre déclaration d'importation:

# noinspection PyUnresolvedReferences
import A

Référence: bug PyCharm PY-224

85
benselme
from C import A, B
assert A is not None and B is not None
# or:
_ = (A, B); del _

Travaille pour moi. Je n'aime pas

# noinspection PyUnresolvedReferences

car cela donnerait de faux négatifs dans le cas où A ne peut pas être importé. Et

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

est cryptique et n'est pas pratique pour le refactoring.

0
Peter Zagubisalo