it-swarm.com.de

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

Ich habe ein Projekt in Pycharm, das wie folgt organisiert ist:

-- 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 Sources sind leere Dateien. Ich erhalte viele Warnungen der Art:

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

Zum Beispiel hat mein 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 'choice' kann in __init__.py nicht gefunden werden

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

Danke im Voraus.

55
pceccon

Dies ist ein Fehler in Pycharm. PyCharm erwartet anscheinend, dass das referenzierte Modul in einer __all__ = [] - Anweisung enthalten ist.

Soll die Anweisung __all__ Aus Ihren Modulen eingefügt werden, um eine ordnungsgemäße Codierung zu gewährleisten? ..das ist eigentlich die Frage, die der junge Spock beim Testen beantwortet, worauf er antwortet: "Es ist moralisch lobenswert, aber moralisch nicht verbindlich."

Um das zu umgehen, können Sie das einfach deaktivieren (extrem unkritisch) Inspektion global (sehr nützlich) oder für die spezifische Funktion oder Anweisung unterdrücken.

Um dies zu tun:

  • setze das Caret über den fehlerhaften Text ('Wahl', aus deinem obigen Beispiel)
  • Rufe das Intention-Menü auf (Alt-Enter standardmäßig, Mine ist auf 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 solchen kleinen Fehlern, aber meiner Meinung nach überwiegen die Vorteile bei weitem die Nachteile. Wenn Sie eine andere gute IDE ausprobieren möchten, gibt es auch Spyder/Spyderlib.

Ich weiß, dass dies ziemlich viel ist, nachdem Sie Ihre Frage gestellt haben, aber ich hoffe, dass dies hilft (Ihnen oder jemand anderem).

Bearbeitet: Ursprünglich dachte ich, dass dies spezifisch für die Prüfung von __all__ Ist, aber es sieht so aus, als ob es sich um die allgemeinere Prüfung "Nicht aufgelö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 PyUnresolvedReferences In der Zeile vor der Anweisung angeben.

74
Mr. B

Sie sollten sich zuerst this ansehen. Dies erklärt, was passiert, wenn Sie ein Paket importieren. Zur Bequemlichkeit:

Die import-Anweisung verwendet die folgende Konvention: Wenn der __init__.py - Code eines Pakets eine Liste mit dem Namen __all__ Definiert, wird dies als Liste der Modulnamen angesehen, die bei from package import * Importiert werden sollen. angetroffen wird. Es ist Sache des Paketautors, diese Liste auf dem neuesten Stand zu halten, wenn eine neue Version des Pakets veröffentlicht wird. Paketautoren können auch beschließen, diese Option nicht zu unterstützen, wenn sie keine Verwendung für den Import * aus ihrem Paket sehen.

PyCharm berücksichtigt dies, indem es eine Warnmeldung anzeigt, sodass 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 leicht entfernen, indem Sie die Namen der zu importierenden Module hinzufügen, wenn Ihr Paket in die Variable __all__ Importiert wird, die wie folgt aufgelistet ist

__init__.py

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

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

16

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

Die Antwort auf 2018 ist die hier ausgewählte Pycharm: "ungelöster Verweis" -Fehler bei IDE beim Öffnen eines Arbeitsprojekts

Beachten Sie jedoch, dass Sie nur einen Content Root, Aber auch mehrere Source Folders Hinzufügen können. Es ist nicht erforderlich, init . Py-Dateien zu berühren

6
edilio

Haben Sie vergessen, das init. Py in Ihr Paket aufzunehmen?

1
Kai Wang