Python {Ошибка имени} имя «я» не определено в __init__

#python #variables #self #re #self-reference

Вопрос:

Я создаю небольшой скрипт/программу на python для извлечения экзаменационных вопросов из определенной медицинской школы на основе фильтрации ключевых слов.

Это работает довольно хорошо. Я добавлял все больше и больше функций и улучшал совместимость, а также провел некоторую отладку. Однако внезапно теперь скрипт все время возвращает ноль вопросов, и при входе в режим отладки я обнаружил, что NameError в строке функции класса происходит очень странное явление __init__ , которое раньше работало нормально. Я не совсем уверен, что вызвало это tbh, хотя IIRC я внес некоторые небольшие коррективы в эту часть кода.

При просмотре рассматриваемой переменной в self.rawQuestions отладчике кажется , что она работает нормально до определенной строки кода, после чего NameError происходит.

Также стоит отметить, что я новичок, когда дело доходит до программирования, поэтому я не удивлюсь, если это действительно глупая ошибка с очевидным решением, извините, если это так. Но когда я ищу в google/stackoverflow аналогичную ошибку, почти во всех вопросах используется ключевое слово self за пределами __init__ класса, которое отличается.

Вот небольшой отрывок с вырезанным несвязанным кодом, ошибка возникает в строке self.rawQuestions = [x for x...:

 class Exam:
    class Course:
        ...
    class Question:
        ...
    def __init__(self, text, path):
        # Add text to text string
        self.text = text

        # Split text into questions
        if re.search(r"(Q|q)uestion", self.text):
            self.rawQuestions = self.text.rsplit("Question")
        elif re.search(r"(F|f)råga", self.text):
            self.rawQuestions = re.split(r"(?:F|f)råga(?=s)", self.text)
        
        ### ERROR IS ON LINE BELOW ###
        # Filter out any questions containing only "Orzone..."
        self.rawQuestions = [x for x in self.rawQuestions if not re.search(r"^(?<!w)s*d*s*Orzones*ABs*Gothenburgs*www.orzone.com.*$", x, flags=re.IGNORECASE|re.DOTALL)]

        # Filter out questions containing a question, but with an "Orzone.. or Course at the end"
        self.rawQuestions = [re.sub(r"sOrzones*ABs*Gothenburgs*www.orzone.com.*$", "", x) for x in self.rawQuestions]

        # Delete course name and semester from questions then filter out empty questions
        self.rawQuestions = [re.sub(rf"s*[w ]*{self.course.searchterm}.*[vh]t-?dd.*$", "", x) for x in self.rawQuestions]

        self.rawQuestions = [x for x in self.rawQuestions if len(x) < 1]

        # Make a list of question objects using the questions extracted using split
        self.questions = []
        for question in self.rawQuestions:
            self.questions.append(self.Question(question, self))
 

Комментарии:

1. Class это не то же class самое, что . Python чувствителен к регистру. Код должен выдать сообщение об ошибке, в котором указано Class , что он не определен. У вас опечатка. Вы написали Class вместо class

2. Ой, это тоже неверно только здесь, на SO, а не в моем коде… извините. В моем коде написано класс.

Ответ №1:

Проблема здесь должна заключаться в отступе в вашем методе__ init__. Попробуй изменить это вот так:

 class Exam:
    def __init__(self, text, path):
        # Add text to text string
        self.text = text

        # Split text into questions
        if re.search(r"(Q|q)uestion", self.text):
            self.rawQuestions = self.text.rsplit("Question")
        elif re.search(r"(F|f)råga", self.text):
            self.rawQuestions = re.split(r"(?:F|f)råga(?=s)", self.text)

        # Filter out any questions containing only "Orzone..."
        self.rawQuestions = [x for x in self.rawQuestions if not re.search(r"^(?<!w)s*d*s*Orzones*ABs*Gothenburgs*www.orzone.com.*$", x, flags=re.IGNORECASE|re.DOTALL)]

        # Filter out questions containing a question, but with an "Orzone.. or Course at the end"
        self.rawQuestions = [re.sub(r"sOrzones*ABs*Gothenburgs*www.orzone.com.*$", "", x) for x in self.rawQuestions]

        # Delete course name and semester from questions then filter out empty questions
        self.rawQuestions = [re.sub(rf"s*[w ]*{self.course.searchterm}.*[vh]t-?dd.*$", "", x) for x in self.rawQuestions]

        self.rawQuestions = [x for x in self.rawQuestions if len(x) < 1]

        # Make a list of question objects using the questions extracted using split
        self.questions = []
        for question in self.rawQuestions:
            self.questions.append(self.Question(question, self))

    class Course:
        ...
    class Question:
        ...
 

Комментарии:

1. упс, я неправильно отформатировал код здесь, на stackoverflow. На самом деле он отформатирован так, как вы это сделали ^^ извините за это, отредактировано сейчас. При условии, что отступ правильный, какова может быть другая причина?

2. Class это не то же class самое, что .

3. Ой, это тоже неверно только здесь, на SO, а не в моем коде… извините. В моем коде написано «девушка с «.

4. Есть еще какие-нибудь идеи? @Суджей