web-dev-qa-db-fra.com

Impossible de trouver la référence 'xxx' dans __init__.py - Python / Pycharm

J'ai un projet à Pycharm organisé comme suit:

-- Sources
   |--__init__.py
   |--Calculators
      |--__init__.py
      |--Filters.py
   |--Controllers
      |--__init__.py
      |--FiltersController.py
   |--Viewers
      |--__init__.py
      |--DataVisualization.py
   |--Models
      |--__init__.py
      |--Data

Tous mes __init__.py, sauf celui de droite Sources sont des fichiers vierges. Je reçois beaucoup d'avertissements du genre:

Impossible de trouver la référence 'xxx' dans __init__.py

Par exemple, mon FiltersController. Py a cet élément de code:

import numpy.random as npr

bootstrap = npr.choice(image_base.data[max(0, x-2):x+3, max(0, y-2):y+3].flatten(), size=(3, 3), replace=True)

Et je reçois cet avertissement:

Impossible de trouver la référence 'choix' dans __init__.py

Je suis sur Google en train de me demander ce que cela signifie et que dois-je faire pour coder correctement en Python.

Merci d'avance.

55
pceccon

C'est un bug dans pycharm. PyCharm semble s’attendre à ce que le module référencé soit inclus dans un __all__ = [] déclaration.

Pour une étiquette appropriée, vous devriez inclure le __all__ déclaration de vos modules? … c’est en fait la question à laquelle nous entendons le jeune Spock répondre alors qu’il était testé, à laquelle il a répondu: "C’est moralement louable mais pas moralement obligatoire".

Pour le contourner, vous pouvez simplement désactiver cette option. (extrêmement non critique) (très utile) une inspection globale ou supprimez-la pour une fonction ou une instruction spécifique.

Faire cela:

  • place le curseur sur le texte erroné ('choice', tiré de l'exemple ci-dessus)
  • Afficher le menu intention (alt-enter par défaut, le mien est défini sur alt-backspace)
  • appuyez sur la flèche droite pour ouvrir le sous-menu et sélectionnez l'action appropriée.

PyCharm a son lot de petits bugs comme celui-ci, mais à mon avis, ses avantages dépassent de loin ses inconvénients. Si vous souhaitez essayer un autre bon IDE, il y a aussi Spyder/Spyderlib.

Je sais que c'est un peu après que vous ayez posé votre question, mais j'espère que cela vous aidera (à vous ou à quelqu'un d'autre).

Edited: À l'origine, je pensais que cela était spécifique à la vérification de __all__ _, mais il semble que ce soit le contrôle plus général 'Références non résolues', qui peut être très utile. Il est probablement préférable d’utiliser la désactivation au niveau instruction de la fonctionnalité, soit en utilisant le menu mentionné ci-dessus, soit en spécifiant # noinspection PyUnresolvedReferences sur la ligne précédant la déclaration.

74
Mr. B

Vous devriez d'abord jeter un oeil à this . Cela explique ce qui se passe lorsque vous importez un package. Pour plus de commodité:

L’instruction import utilise la convention suivante: si un paquet __init__.py code définit une liste nommée __all__, il s’agit de la liste des noms de modules à importer lorsque from package import * est rencontré. Il appartient à l'auteur du paquet de tenir cette liste à jour lorsqu'une nouvelle version du paquet est publiée. Les auteurs de paquet peuvent également décider de ne pas le supporter, s’ils ne voient aucune utilisation pour importer * à partir de leur paquet.

Donc, PyCharm respecte cela en affichant un message d'avertissement, de sorte que l'auteur puisse décider lequel des modules sera importé lorsque * du paquet est importé. Cela semble donc être une fonctionnalité utile de PyCharm (et je ne présume en aucun cas que ce soit un bug). Vous pouvez facilement supprimer cet avertissement en ajoutant les noms des modules à importer lorsque votre package est importé dans le fichier __all__ variable qui est la liste, comme ceci

__init__.py

from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]

Après avoir ajouté ceci, vous pouvez ctrl+click sur ces noms de modules utilisés dans toute autre partie de votre projet pour accéder directement à la déclaration, ce que je trouve souvent très utile.

16
Sнаđошƒаӽ

Je sais que c'est vieux mais google m'a envoyé ici donc je suppose que d'autres vont venir aussi comme moi.

La réponse sur 2018 est celle sélectionnée ici Pycharm: erreur "Référence non résolue" sur l'erreur IDE lors de l'ouverture d'un projet en cours

Sachez simplement que vous ne pouvez ajouter qu'un seul Content Root mais vous pouvez ajouter plusieurs Source Folders. Pas besoin de toucher les fichiers init . Py

6
edilio

Avez-vous oublié d'ajouter le init. Py dans votre paquet?

1
Kai Wang