Die Referenz 'xxx' kann in __init__.py - Python / Pycharm nicht gefunden werden

74

Ich habe ein Projekt in Pycharm wie folgt organisiert:

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

Alle meine __init__.py, mit Ausnahme der oben genannten Quellen, sind leere Dateien. Ich erhalte viele Warnungen dieser Art:

Die Referenz 'xxx' in __init__.py kann nicht gefunden werden

Zum Beispiel hat meine FiltersController .py diesen 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)

Und ich bekomme diese Warnung:

Die Referenz 'Auswahl' kann in __init__.py nicht gefunden werden

Ich google und frage mich, was das bedeutet und was ich tun soll, um in Python richtig zu codieren.

Danke im Voraus.

Pceccon
quelle
Warnungen vor was ? Eine IDE? Python selbst gibt solche Warnungen nicht aus.
Daniel Roseman
Was warnt Sie? Soweit ich weiß, ist dies keine Python-Fehlermeldung. Verwenden Sie eine IDE oder ein Tool zur Stilprüfung?
Kindall
Ja Entschuldigung. Ich benutze Pycharm.
Pceccon
1
In meinem Fall wurde diese Warnmeldung unter macOS 10.13.3, PyCharm Professional 2017.3.3, durch einfaches Neustarten von PyCharm behoben.
nämlich
Ich finde nur, dass dies passiert, wenn ich numpy mit pip installiert habe. Wenn ich es stattdessen direkt über Pycharm separat installiere, gibt es keine Probleme.
Joshmcode

Antworten:

93

Dies ist ein Fehler in Pycharm. PyCharm scheint zu erwarten, dass das referenzierte Modul in einer __all__ = []Anweisung enthalten ist.

Sollten Sie für eine ordnungsgemäße Codierungsetikette die __all__Aussage Ihrer Module einschließen ? ..das ist eigentlich die Frage, die der junge Spock während des Tests beantworten hört, auf die er antwortete: "Es ist moralisch lobenswert, aber moralisch nicht obligatorisch."

Um dies zu umgehen, können Sie diese (äußerst unkritische) (äußerst nützliche) Überprüfung einfach global deaktivieren oder für die jeweilige Funktion oder Anweisung unterdrücken.

Um dies zu tun:

  • Setzen Sie das Caret über den fehlerhaften Text ('Auswahl', aus Ihrem obigen Beispiel)
  • Rufen Sie das Intentionsmenü auf (standardmäßig Alt-Enter, meins ist Alt-Backspace eingestellt).
  • Klicken Sie auf den Pfeil nach rechts, um das Untermenü zu öffnen, und wählen Sie die entsprechende Aktion aus

PyCharm hat seinen Anteil an kleinen Fehlern wie diesen, aber meiner Meinung nach überwiegen seine Vorteile bei weitem die Nachteile. Wenn Sie eine andere gute IDE ausprobieren möchten, gibt es auch Spyder / Spyderlib.

Ich weiß, dass dies ziemlich lange dauert, nachdem Sie Ihre Frage gestellt haben, aber ich hoffe, dass dies hilft (Sie oder jemand anderes).

Bearbeitet: Ursprünglich dachte ich, dass dies spezifisch für die Überprüfung ist __all__, aber es sieht so aus, als ob es sich um die allgemeinere Überprüfung "Ungelöste Referenzen" handelt, die sehr nützlich sein kann. Es ist wahrscheinlich am besten, die Funktion auf Anweisungsebene zu deaktivieren, indem Sie entweder das oben erwähnte Menü verwenden oder # noinspection PyUnresolvedReferencesin der Zeile vor der Anweisung angeben.

Brian Visel
quelle
25

Sie sollten zuerst einen Blick auf nehmen diese . Dies erklärt, was passiert, wenn Sie ein Paket importieren. Zur Bequemlichkeit:

Die import-Anweisung verwendet die folgende Konvention: Wenn der __init__.pyCode eines Pakets eine Liste mit dem Namen definiert __all__, wird dies als Liste der Modulnamen angesehen, die importiert werden sollen, wenn sie from package import *auftreten. Es ist Sache des Paketautors, diese Liste auf dem neuesten Stand zu halten, wenn eine neue Version des Pakets veröffentlicht wird. Paketautoren entscheiden sich möglicherweise auch dafür, es nicht zu unterstützen, wenn sie keine Verwendung für den Import * aus ihrem Paket sehen.

PyCharm respektiert dies, indem es eine Warnmeldung anzeigt, damit der Autor entscheiden kann, welches der Module importiert wird, wenn * aus dem Paket importiert wird. Daher scheint dies eine nützliche Funktion von PyCharm zu sein (und ich nehme an, es kann in keiner Weise als Fehler bezeichnet werden). Sie können diese Warnung einfach entfernen, indem Sie die Namen der Module hinzufügen, die importiert werden sollen, wenn Ihr Paket in die folgende __all__Variable importiert wird

__init__.py

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

Nachdem Sie dies hinzugefügt haben, können Sie ctrl+clickauf diesen Modulnamen, die in einem anderen Teil Ihres Projekts verwendet werden, direkt zur Deklaration springen, was ich oft sehr nützlich finde.

Sнаđошƒаӽ
quelle
3
Ich bin damit einverstanden, dass die Warnung kein Fehler ist, aber die Tatsache, dass Sie nicht bei gedrückter Strg-Taste auf dieses Modul klicken können, konnte behoben werden
user110954
@ user110954 Vielleicht untersucht PyCharm die __init__.pyDatei, um zu dem Modul zurückzukehren, in dem sich eine Funktion / Variable befindet. Ohne __all__die Modulnamen kann es also nicht zur Quelle zurückverfolgt werden. Dies ist meine Annahme, ich kann mich irren.
Sнаđошƒаӽ
10

Ich weiß, dass dies alt ist, aber Google hat mich hierher geschickt, damit ich denke, dass andere auch so wie ich kommen werden.

Die Antwort für 2018 ist die hier ausgewählte: Pycharm: Fehler "ungelöste Referenz" in der IDE beim Öffnen eines Arbeitsprojekts

Beachten Sie jedoch, dass Sie nur einen hinzufügen können, Content Rootaber Sie können mehrere hinzufügen Source Folders. Sie müssen keine __init__.pyDateien berühren .

edilio
quelle
Dies sollte die akzeptierte Antwort sein! Der aktuelle funktioniert einfach nicht, und das tut es
Gulzar
7

Sie können das Quellverzeichnis wie folgt als Quellstamm markieren:

  • Klicken Sie mit der rechten Maustaste auf das Quellverzeichnis
  • Verzeichnis als -> Quellstamm markieren
  • Datei -> Caches ungültig machen / neu starten ... -> Ungültig machen und neu starten
Absin
quelle
0

Stellen Sie sicher, dass Sie den Dateityp der __init__.pyDateien nicht versehentlich geändert haben . Wenn Sie beispielsweise den Typ in "Text" (anstelle von "Python") geändert haben, analysiert PyCharm die Datei nicht auf Python-Code. In diesem Fall stellen Sie möglicherweise fest, dass sich das Dateisymbol für __init__.pyDateien von anderen Python-Dateien unterscheidet.

Um dies zu beheben, Settings > Editor > File Typesklicken Sie in der Liste "Erkannte Dateitypen" auf "Text" und entfernen Sie in der Liste "Dateinamenmuster" __init__.py.

Xavier
quelle
-2

Haben Sie vergessen, die init .py in Ihr Paket aufzunehmen?

Kai Wang
quelle
-7

Ich habe dieses Problem in meinem Pycharm etwas anders gelöst.

Gehen Sie zu Einstellungen -> Projektinterpreter und klicken Sie dort auf das Basispaket.

Sie sehen eine Seite wie diese

problemGuide

Wenn Ihr Paket danach installiert ist, sollten Sie sehen, dass das Paket eher blau als weiß gefärbt ist.

Und die ungelöste Referenz ist auch weg.

Abdullah Noman
quelle
5
Dies bezieht sich nicht auf die installierte paketbezogene Referenz. Bitte lesen Sie die Frage vor der Beantwortung
Bg1850