2017-02-02 6 views
0

Mein Code ist ein wenig komplex, so werde ich ein Beispiel zeigen:Python Import: kann nicht importieren Name

Datei A.py:

from B import B 

class A(): 

def __init__(self): 

    self.id = 5 

    self.b = B() 

Datei B.py

from A import A 

class B(): 

def __init__(self): 

    self.id = 15 

    self.a = A() 

Dies ist die Ausnahme, die ich erhalte:

Traceback (most recent call last): 
File "F:/Project/Code/A.py", line 1, in <module> 
from B import B 
File "F:\Project\Code\B.py", line 1, in <module> 
from A import A 
File "F:\Project\Code\A.py", line 1, in <module> 
from B import B 
ImportError: cannot import name B 

Alle Ich will, dass A eine Instanz von B und B enthält, um eine Instanz von A zu enthalten. Ich weiß, dass ich sie nur in eine einzige Datei konvertieren muss, aber ich möchte nicht, mein Code ist in viel größeren Maßstäben und mein Lehrer zwingt mich, mehrere kurze Skripts anstelle eines langen Codes zu behalten.

Jeder Vorschlag wird geschätzt.

+1

„Alles, was ich will, ist eine eine Instanz von B und B enthalten eine enthalten Instanz von A "- selbst wenn Sie das zirkuläre Importproblem lösen, ist dies immer noch ein grundlegendes b Roken-Design. Ein A enthält ein B, das ein anderes A enthält, das ein anderes B usw. enthält. Zum Erstellen eines dieser Objekte müssen Sie eine unendliche Anzahl von Objekten erstellen. – user2357112

+1

Siehe diese Frage: http://stackoverflow.com/questions/11698530/two-python-modules-require-each-others-contents-can-that-work – ScottSmudger

+0

Ich nehme an, er könnte irgendwie eine maximale Schöpfung Rekursion Tiefe angeben, aber das ist ein ziemlich schweres Meta-Thema – Woody1193

Antwort

0

Sie erhalten den Fehler, weil Ihre Skripts rekursive Importe haben.

A.py ist abhängig von B module. Aber B.py hängt von ab. Und Python kann keine Importe auflösen.

Sie können alle Klassen in einem Modul schreiben. Oder stellen Sie sicher, dass keine zyklische Abhängigkeit besteht.

Das gleiche Problem kann mit dem Import von Variablen, Funktionen sein.

+0

Wenn jemand darüber diskutieren will. Schreib mir Kommentare. Ich verstehe nicht, warum meine Antwort nicht nützlich ist. –

+0

Danke für Rollback ... –

+1

Oh - ich las das als Rollback-Edit, vs zurückgerollten Abstimmung, daher Überprüfung der Bearbeitungsverlauf (meine erste Lesung der oben genannten war wie eine sarkastische Antwort an jemand anderes eine Bearbeitung zurückrollen Sie dachten, es war in Ordnung). Entschuldigung, dort. –

0

Sie können keine Zwei-Wege-Abhängigkeit haben, denn das ist jede b Eigenschaft in A ist eine B Instanz, die ihre eigenen A enthält bedeuten würde, und so weiter.

A 
- id: 5 
- b: B 
    - id: 15 
    - a: A 
      - id: 15 
      - b: B ... 
-1

Sie können nicht. Es ist jetzt wie eine Schleife. Wenn Sie eine importieren, importiert sie die andere.

Auch mussten Sie für Leerzeichen nach dem class A(): und class B(): hinzufügen. Ihr Code wird sein:

Datei A.py

from B import B 

class A(): 

    def __init__(self): 

     self.id = 5 

     self.b = B() 

Datei B.py:

from A import A 

class B(): 

    def __init__(self): 

     self.id = 15 

     self.a = A() 
+0

Wahr, dass Leerzeichen benötigt werden, false, dass gegenseitige Importe funktionieren, nachdem sie hinzugefügt wurden. –

+0

Wir sollten Menschen, die echte Probleme haben, nicht trollen. – Woody1193

+0

Ich wusste es nicht ... Bitte nicht Downvote! –

0

Was Sie einen Import-Loop genannt haben wird. Wie Sie über das Fixieren gehen, verschieben Sie den gegenseitig abhängigen Code in eine Klasse C, die beide dann referenzieren.

In C.py:

def class C: 

    def __init__(self): 
     # Do some stuff 

    # other methods 

In A.py:

from C import C 

def class A(C): 

    def __init__(self): 
     # Do some stuff in A 

    # other methods 

In B.py:

from C import C 

def class B(C): 

    def __init__(self): 
     # Do some stuff in B 

    # other methods 
Verwandte Themen