/
disciplina
/
stepik-python-debugging
Обзор
Документация
Войти
/
disciplina
/
stepik-python-debugging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
lessons/module2/2.1/lesson1.step
18 строк
8 KB
Sergey
Вторая версия курса
27 янв 2026, 21:14
27 янв 2026, 21:14
79b9655
Код
Авторство
О чём код?
{ "block": { "name": "text", "text": "<h2>Практика: Отладка программы вывода списка каталогов</h2>\n\n<p>В этом уроке мы будем отлаживать программу, которая должна выводить список всех каталогов в указанной директории, но работает неправильно.</p>\n\n<h3>Исходный код программы</h3>\n\n<pre><code>import os\nimport sys\n\ndef list_directories(path):\n \"\"\"Выводит список всех каталогов в указанной директории\"\"\"\n try:\n items = os.listdir(path)\n directories = []\n \n for item in items:\n full_path = os.path.join(path, item)\n if os.path.isfile(full_path): # ОШИБКА ЗДЕСЬ!\n directories.append(item)\n \n return directories\n except FileNotFoundError:\n print(f\"Ошибка: путь '{path}' не найден\")\n return []\n except PermissionError:\n print(f\"Ошибка: нет доступа к '{path}'\")\n return []\n\ndef main():\n if len(sys.argv) < 2:\n path = \".\"\n else:\n path = sys.argv[1]\n \n print(f\"Поиск каталогов в: {path}\")\n dirs = list_directories(path)\n \n if dirs:\n print(f\"\\nНайдено каталогов: {len(dirs)}\")\n for directory in dirs:\n print(f\" - {directory}\")\n else:\n print(\"Каталоги не найдены\")\n\nif __name__ == \"__main__\":\n main()\n</code></pre>\n\n<h3>Описание проблемы</h3>\n\n<p>Программа должна выводить список всех <strong>каталогов</strong> (папок) в указанной директории, но вместо этого выводит список <strong>файлов</strong>.</p>\n\n<p><strong>Ожидаемое поведение:</strong></p>\n<pre><code>$ python list_dirs.py /home/user\nПоиск каталогов в: /home/user\n\nНайдено каталогов: 3\n - Documents\n - Downloads\n - Pictures\n</code></pre>\n\n<p><strong>Фактическое поведение:</strong></p>\n<pre><code>$ python list_dirs.py /home/user\nПоиск каталогов в: /home/user\n\nНайдено каталогов: 15\n - file1.txt\n - file2.pdf\n - readme.md\n ...\n</code></pre>\n\n<h3>Задание для отладки</h3>\n\n<p>Используя pdb, выполните следующие шаги для поиска и исправления ошибки:</p>\n\n<h4>Шаг 1: Установите точку останова</h4>\n<p>Добавьте <code>breakpoint()</code> в функцию <code>list_directories</code> перед циклом:</p>\n<pre><code>def list_directories(path):\n try:\n items = os.listdir(path)\n directories = []\n \n breakpoint() # Точка останова\n \n for item in items:\n # ...\n</code></pre>\n\n<h4>Шаг 2: Запустите программу</h4>\n<pre><code>python list_dirs.py .\n</code></pre>\n\n<h4>Шаг 3: Проверьте значения в отладчике</h4>\n<p>Когда программа остановится, выполните следующие команды в pdb:</p>\n<pre><code>(Pdb) p path # Проверить переданный путь\n(Pdb) p items # Проверить список всех элементов\n(Pdb) n # Перейти к следующей строке (первая итерация цикла)\n(Pdb) n # Построить полный путь\n(Pdb) p full_path # Проверить полный путь\n(Pdb) p os.path.isfile(full_path) # Что возвращает эта проверка?\n(Pdb) p os.path.isdir(full_path) # А что возвращает эта?\n</code></pre>\n\n<h4>Шаг 4: Найдите ошибку</h4>\n<p>Обратите внимание на условие в строке:</p>\n<pre><code>if os.path.isfile(full_path): # Проверяет, является ли элемент ФАЙЛОМ\n directories.append(item) # Добавляет в список каталогов\n</code></pre>\n\n<p><strong>Проблема:</strong> Мы проверяем <code>os.path.isfile()</code> (является ли файлом), но добавляем результат в список каталогов!</p>\n\n<h3>Исправление</h3>\n\n<p>Замените <code>os.path.isfile()</code> на <code>os.path.isdir()</code>:</p>\n<pre><code>if os.path.isdir(full_path): # Правильно: проверяем, является ли каталогом\n directories.append(item)\n</code></pre>\n\n<h3>Исправленный код</h3>\n\n<pre><code>import os\nimport sys\n\ndef list_directories(path):\n \"\"\"Выводит список всех каталогов в указанной директории\"\"\"\n try:\n items = os.listdir(path)\n directories = []\n \n for item in items:\n full_path = os.path.join(path, item)\n if os.path.isdir(full_path): # ИСПРАВЛЕНО!\n directories.append(item)\n \n return directories\n except FileNotFoundError:\n print(f\"Ошибка: путь '{path}' не найден\")\n return []\n except PermissionError:\n print(f\"Ошибка: нет доступа к '{path}'\")\n return []\n\ndef main():\n if len(sys.argv) < 2:\n path = \".\"\n else:\n path = sys.argv[1]\n \n print(f\"Поиск каталогов в: {path}\")\n dirs = list_directories(path)\n \n if dirs:\n print(f\"\\nНайдено каталогов: {len(dirs)}\")\n for directory in dirs:\n print(f\" - {directory}\")\n else:\n print(\"Каталоги не найдены\")\n\nif __name__ == \"__main__\":\n main()\n</code></pre>\n\n<h3>Что мы узнали</h3>\n\n<ul>\n<li>✅ Как использовать <code>breakpoint()</code> для остановки программы в нужном месте</li>\n<li>✅ Как проверять значения переменных с помощью команды <code>p</code></li>\n<li>✅ Как пошагово выполнять код с помощью команды <code>n</code></li>\n<li>✅ Как тестировать выражения прямо в отладчике</li>\n<li>✅ Важность внимательной проверки логических условий</li>\n</ul>\n\n<h3>Типичные ошибки такого рода</h3>\n\n<p>Эта ошибка относится к категории <strong>логических ошибок</strong> — программа работает без исключений, но даёт неверный результат из-за ошибки в логике. Такие ошибки:</p>\n<ul>\n<li>Не вызывают исключений</li>\n<li>Не всегда очевидны при чтении кода</li>\n<li>Легко находятся с помощью пошаговой отладки</li>\n<li>Часто возникают из-за опечаток или невнимательности</li>\n</ul>\n\n<p>В следующем уроке мы рассмотрим ещё один пример отладки консольного приложения.</p>", "video": null, "options": {}, "subtitle_files": [], "is_deprecated": false, "source": {}, "subtitles": {}, "tests_archive": null, "feedback_correct": "", "feedback_wrong": "" }, "id": null, "has_review": false, "time": "2026-01-27T00:00:00.000Z" }