Ошибка импорта Python, похоже на рекурсивный импорт, но не может быть решена таким способом - PullRequest
1 голос
/ 30 марта 2012

Обновлено Проблема решена, у меня возникла проблема с дизайном.

Каталог выглядит так:

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

И проблема в том, что в quiz.pyЯ импортирую class из test.и в test.py я импортирую class из quiz.

Обновлено: я изменил import, но все еще есть AttributeError

Код следующий:

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

и ошибка

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

СначалаЯ подумал, что, может быть, это рекурсивная проблема, но я только обнаружил, что могу переместить import в функции, чтобы избежать рекурсивного импорта, но здесь нет функций, и я пытаюсь переместить import в класс, это не работает.

Есть ли способ сохранить эти определения в отдельном файле?

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Это классическая ситуация циклического импорта. Вместо того, чтобы использовать «из теста импорта теста», вы можете просто «импортировать тест» и затем получить доступ к тесту по test.Test. Для получения дополнительной информации см. stackoverflow вопрос .

1 голос
/ 30 марта 2012

Переместить QuizCheckout в отдельный модуль. (QuizCheckout ссылается на Test на уровне определения класса, а Test ссылается на Quiz, которая является корнем проблемы)

0 голосов
/ 30 марта 2012

Если то, что пишет hymloth, правильно (я не пробовал), вы также сможете снова использовать имя «Test», выполнив следующее:

import test
Test = test.Test
...