2012-03-30 2 views
1

Aktualisiert Problem gelöst, habe ich ein Design-Problem hier.Python-Importfehler, scheint wie rekursiver Import, aber kann nicht auf diese Weise beheben

Das Verzeichnis sieht wie folgt aus:

/view 
    |-__init__.py 
    |-quiz.py 
    |-test.py 
    |-user.py 

Und das Problem ist, dass in quiz.py, ich class von test importieren. und in test.py importiere ich eine class von quiz.

Aktualisiert: Ich änderte import aber es ist immer noch ein AttributeError

Der Code wie folgt:

quiz.py

#ignore some imports here 
import test 
from user import User 

class Quiz(Document): 
    creator   = ReferenceField(User, reverse_delete_rule=CASCADE) 
    info   = GenericEmbeddedDocumentField("QuizInfo") 
    description  = StringField(max_length=100) 
    attachment  = GenericEmbeddedDocumentField("QuizAttach") 
    correctanswer = GenericEmbeddedDocumentField("QuizAnswer") 
    wronganswer  = GenericEmbeddedDocumentField("QuizAnswer") 
    manualdifficulty= FloatField(min_value=0, max_value=1) 
    autodifficulty = FloatField(min_value=0, max_value=1) 
    checkout  = GenericEmbeddedDocumentField("QuizCheckcout") 
    tag    = ListField(StringField(max_length=20)) 

#ignore some codes here 

class QuizCheckout(EmbeddedDocument): 
    time   = DateTimeField() 
    type   = IntField() 
    description  = StringField() 
    test   = ReferenceField(test.Test, reverse_delete_rule=CASCADE) 

test.py

import quiz 


class Test(Document): 
    createdate  = DateTimeField()    #Create datetime 
    description  = StringField()    #decription of this test 
    takennumber  = IntField()     #the number of students who may take this test 
    quiz   = GenericEmbeddedDocumentField('TestQuiz') 

class TestQuiz(EmbeddedDocument): 
    quiz   = ListField(ReferenceField(quiz.Quiz, reverse_delete_rule=CASCADE)) 
         #Reference to Quiz, if Quiz is deleted, this reference will be deleted too. 
    correct   = IntField() 
         #how many students got this right 

und der Fehler ist

Exception Type: AttributeError Exception 
Value: 'module' object has no attribute 'Quiz' 

Zuerst dachte ich, dass vielleicht ein rekursive Problem, aber ich finde nur, dass ich import in Funktionen bewegen konnte rekursive Import zu vermeiden, aber es gibt keine Funktionen hier, und ich versuche, Verschieben Sie import in Klasse, es funktioniert nicht.

Gibt es eine Möglichkeit, diese Definition in einer separaten Datei zu behalten?

+0

mögliche Duplikate von [zirkuläre (oder zyklische) Importe in Python] (http://stackoverflow.com/questions/ 744373/circular-or-cyclic-imports-in-python) – simonzack

Antwort

1

Verschieben QuizCheckout in ein separates Modul. (QuizCheckout-Referenzen Test auf der Ebene der Klassendefinition, und Testreferenzen Quiz, das ist die Wurzel des Problems)

+0

ja, danke! Habe das schon gefunden. Ich sollte stattdessen 'ListField (ReferenceField())' verwenden. – bxshi

3

Dies ist eine klassische zyklische Importsituation. Anstatt "aus Test-Import-Test" zu verwenden, können Sie einfach "Test importieren" und dann auf Test von Test.Test zugreifen. Für weitere Informationen siehe stackoverflow question.

+0

Ich habe es geändert und es gibt einen weiteren Fehler hier. 'Ausnahmetyp: \t Attribute Ausnahmewert: \t 'Modul' Objekt hat kein Attribut‚Quiz'' – bxshi

+1

@bxshi auch 'von Quiz' Quiz Import ändern, um' Import quiz' –

+0

@JanneKarila ja, ich 'von Quiz Import Quiz ändern '' Quiz importieren «, und ändern' von Test-Import Test 'zu' Test importieren', und es kommt ein 'AttributError' – bxshi

0

Wenn das, was hymloth schreibt korrekt ist (ich habe es nicht ausprobiert out) Sie auch in der Lage sein sollte, diese den Namen „Test“ wieder zu verwenden, indem Sie:

import test 
Test = test.Test 
+0

ja, aber mit seiner Anweisung, kommt ein weiterer Fehler, sagte mir, dass' Modul-Objekt hat kein Attribut 'Quiz', wie ist das? Müsste irgendeine andere Konfiguration vorgenommen werden? – bxshi

+0

Sie könnten den Debugger nach dem Import starten, indem Sie folgendes einfügen: "import pdb; pdb.set_trace()" und dann, sobald der Breakpoint ausgelöst wurde, können Sie "dir (Quiz)" tun, um zu überprüfen, was vor sich geht. Hoffe, es funktioniert! – katzenversteher

Verwandte Themen