Разделите формирование, хранение и отправку отчёта. Исправьте HTML-экранирование, обработку неподдерживаемого формата и ложное сообщение об успешной отправке.
Создание и рассылка отчёта
Разделите формирование, хранение и отправку отчёта. Исправьте HTML-экранирование, обработку неподдерживаемого формата и ложное сообщение об успешной отправке.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо выполнить ревью класса ReportGenerator, который реализует следующие функции:
- формирование отчёта в виде обычного текста или HTML‑страницы;
- запись полученного отчёта в файл;
- отправку отчёта на указанный email‑адрес;
- загрузку ранее сохранённого отчёта из файла.
class ReportGenerator:
def __init__(self, data):
self.data = data
self.report = ""
self.filename = "report.txt"
self.report_type = "text"
def generate_report(self):
print("Generating report...")
if self.report_type == "text":
self.report = self._generate_text_report()
elif self.report_type == "html":
self.report = self._generate_html_report()
else:
print("Unsupported report type")
print("Report generated.")
def _generate_text_report(self):
report = "Text Report\n"
for item in self.data:
report += f"- {item}\n"
return report
def _generate_html_report(self):
report = "<html><body><h1>HTML Report</h1><ul>"
for item in self.data:
report += f"<li>{item}</li>"
report += "</ul></body></html>"
return report
def save_report(self):
with open(self.filename, "w") as f:
f.write(self.report)
print(f"Report saved to {self.filename}")
def send_report(self, email):
print(f"Sending report to {email}")
if "@" not in email:
raise Exception("Invalid email address")
print("Report sent.")
def load_previous_report(self):
print("Loading previous report...")
with open(self.filename, "r") as f:
self.report = f.read()
print("Previous report loaded.")
Ответ
Разделите формирование, хранение и отправку отчёта. Исправьте HTML-экранирование, обработку неподдерживаемого формата и ложное сообщение об успешной отправке.
send_report ничего не отправляет: print нельзя считать доставкой. Проверка символа @ также не подтверждает корректность или существование адреса.
Основные исправления:
- Неизвестный
report_typeдолжен приводить к явной ошибке, а не к сообщению об успехе. - В HTML экранируйте элементы через
html.escape(str(item)). - Формируйте строки через
join, указывайте UTF-8 при чтении и записи. - Передавайте путь явно; защищайте существующие файлы от случайной перезаписи.
- Вынесите файловое хранилище и почтовый транспорт в отдельные зависимости.
Обрабатывайте конкретные файловые и транспортные ошибки, не скрывая их успешными логами. Отдельно проверяйте пустой отчёт и порядок операций.