Ich habe einige Codefragmente, die sich über mehrere Dateien erstrecken und versuchen, sich gegenseitig zu importieren
, wie folgt:
main.py:
from entity import Ent
entity.py:
from physics import Physics
class Ent:
...
physics.py:
from entity import Ent
class Physics:
...
Dann führe ich main.py
aus und erhalte den folgenden Fehler:
Traceback (most recent call last):
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
Ich gehe davon aus, dass der Fehler darauf zurückzuführen ist, dass ich entity
zweimal importiere - einmal in main.py
und später in physics.py
- aber wie kann ich das Problem umgehen?
Siehe auch <a href="https://stackoverflow.com/questions/744373">Was passiert bei der Verwendung von gegenseitigen oder zirkulären Imports in Python?</a> für einen allgemeinen Überblick darüber, was erlaubt ist und was ein Problem bezüglich zirkulärer Imports verursacht. Siehe <a href="https://stackoverflow.com/questions/22187279">Warum scheinen zirkuläre Imports weiter oben im Aufrufstapel zu funktionieren, lösen aber dann einen ImportError weiter unten aus?</a> für technische Details darüber, <strong>warum und wie</strong> das Problem auftritt.
1 Stimmen
@jsells Du solltest deine Klassen einfach
Entity
undVektor
nennen, anstattEnt
undVect
, es gibt keinen Grund, solche Namen zu kürzen. Und ja, benutzeimport vektor
und dannx = vektor.Vektor(0,0,0)
.8 Stimmen
Hey @Kevin, da du Java besser kennst, was ist dein Eindruck von diesem Artikel von 2008, in dem der Autor im ersten Satz darauf hinweist, dass zirkuläre Abhängigkeiten in Java "ziemlich weit verbreitet" sind?
1 Stimmen
Jede wichtige Sprache unterstützt zirkuläre Imports ohne Probleme... C#, C, C++, Java, Objective-C... Wir haben nicht das Jahr 1991.
0 Stimmen
Ich habe eine sehr ähnliche Frage hier beantwortet: stackoverflow.com/questions/50312470/…
1 Stimmen
Wenn Sie nicht von Kreisabhängigkeiten wegkommen können, können Sie direkt in der Funktion oder Klasse importieren, in der Sie die bestimmte Abhängigkeit benötigen, anstatt global in die Datei.
1 Stimmen
Es gibt einige weitere Beispiele zur Lösung von zirkulären Abhängigkeiten unter How to avoid circular imports in Python? (jetzt als Duplikat davon markiert).
1 Stimmen
@KevinParker Es ist definitiv nicht so, wie du die Dinge darstellst. In C und C++ gibt es überhaupt kein Import-System -
#include
führt eine wortwörtliche Textkopie und Einfügung des Dateiinhalts durch, mit nur sehr geringer Verarbeitung - aber der Effekt für den Compiler ist so, als ob der gleiche Quellcode bereits vorhanden wäre; es ist überhaupt nicht wie ein richtiges Import-System. Und es unterstützt nicht zirkuläre Referenzen "ohne Probleme"; Include-Guards sind notwendig, um zu verhindern, dass die One Definition Rule verletzt wird.0 Stimmen
In Bezug auf C#, Java etc. bieten sie keine Entsprechungen zu den Funktionen, die dazu führen, dass Python ein Problem zeigt - also zu der Syntax
from ... import
und seiner Fähigkeit, beliebige Namen zu importieren (nicht nur Klassen oder Module). Java hat nicht einmal ein Konzept von Top-Level-Code, der automatisch ausgeführt wird, wenn etwas importiert wird; der gesamte Code muss in Klassen sein. Also ist die Kritik, die du äußerst, einfach fehlgeleitet - es ist überhaupt kein fairer Vergleich.0 Stimmen
Für Python-Module ist es möglich, sich selbst im globalen Cache der importierten Module während des Importvorgangs zu ersetzen. Mir ist keine andere Sprache bekannt, die diese spezielle Art von Flexibilität bietet.
1 Stimmen
Haben Sie versucht, es mit dem
abc
-Modul zu lösen? Siehe docs.python.org/3/library/abc.html