#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. Есть еще какие-нибудь идеи? @Суджей