Разделение кода на файлы: короткий гайд для Python
Разберём на небольшом проекте, как вынести функции, настройки и запуск Python-программы в отдельные файлы. Вы получите рабочую структуру без сложных пакетов и поймёте, где заканчивается порядок и начинается лишняя архитектура.

За 15–20 минут вы разложите небольшую программу на три Python-файла: настройки, функции и точку запуска. Пример рассчитан на Python 3.12 и не требует сторонних библиотек: после каждого шага программу можно запустить и проверить результат.
Что подготовить до начала
Нужен установленный Python 3.12 или совместимая версия Python 3.x, любой редактор кода и терминал. Создайте пустую папку проекта, например split_demo. Все файлы на первом этапе будут лежать в одной директории.
main.py— запуск программы и взаимодействие с пользователем;text_tools.py— функции обработки текста;settings.py— постоянные настройки проекта.
Если команда python --version показывает другую версию, пример, скорее всего, тоже запустится на Python 3.10–3.13. Но для статьи ориентир — Python 3.12.
Хорошее разделение начинается не с количества файлов, а с понятной ответственности каждого из них.
Шаг 1. Создайте файл настроек
Начните с значения, которое может понадобиться в нескольких местах. Вынесем максимальную длину строки в settings.py, чтобы не искать число по всему проекту.
# settings.py
MAX_TEXT_LENGTH = 120
Здесь нет функций и логики запуска. Файл только хранит настройку. Имя константы написано заглавными буквами — так в Python обычно обозначают значения, которые не должны меняться во время работы программы.
Проверка. В каталоге должен появиться файл settings.py с одной константой. Отдельно запускать его не нужно: он будет импортирован другим файлом.
Шаг 2. Вынесите работу с текстом
Создайте text_tools.py. В нём будут функции, которые ничего не знают о терминале и не запрашивают ввод. Это важная граница: модуль можно будет использовать не только в консольной программе.
# text_tools.py
from settings import MAX_TEXT_LENGTH
def normalize_text(text: str) -> str:
"""Убирает лишние пробелы по краям и заменяет повторяющиеся пробелы."""
return ' '.join(text.split())
def shorten_text(text: str, max_length: int = MAX_TEXT_LENGTH) -> str:
"""Ограничивает длину текста и добавляет многоточие при необходимости."""
if len(text) <= max_length:
return text
return text[:max_length - 3].rstrip() + '...'
Первая функция нормализует строку, вторая сокращает её. Импорт MAX_TEXT_LENGTH связывает модуль с настройками, но не с пользовательским интерфейсом.
Проверка. Запустите команду ниже из папки проекта. Она должна завершиться без вывода и без ошибки.
python -c "from text_tools import normalize_text; print(normalize_text(' Привет мир '))"
В терминале появится Привет мир. Если команда python не найдена, в вашей системе запуск может выполняться через python3.
Шаг 3. Оставьте в главном файле только сценарий запуска
Теперь создайте main.py. Он принимает строку, передаёт её функциям и печатает результат. Саму обработку текста сюда не копируйте.
# main.py
from text_tools import normalize_text, shorten_text
def main() -> None:
source_text = input('Введите текст: ')
normalized_text = normalize_text(source_text)
result_text = shorten_text(normalized_text)
print(f'Результат: {result_text}')
if __name__ == '__main__':
main()
Конструкция if __name__ == '__main__': запускает main() только при прямом запуске файла. Если другой файл импортирует main.py, программа не начнёт неожиданно спрашивать ввод.
Проверка. Выполните:
python main.py
Терминал попросит ввести текст и напечатает строку с префиксом Результат:. Для проверки ограничения вставьте текст длиннее 120 символов: результат должен закончиться многоточием.
Шаг 4. Проверьте структуру и импорты
В итоге папка выглядит так:
split_demo/
├── main.py
├── settings.py
└── text_tools.py
Импорт без расширения — это нормально: в строке from text_tools import normalize_text не нужно писать .py. Python ищет модуль в текущей папке и загружает его как файл программы.
Проверьте запуск из каталога проекта, а не из соседней папки. Для быстрой проверки синтаксиса можно выполнить:
python -m py_compile main.py text_tools.py settings.py
Проверка. Если синтаксис корректен, команда ничего не выведет и завершится без сообщения об ошибке. Python может создать папку __pycache__ — это служебные скомпилированные файлы, удалять её для работы не требуется.
Если не получилось
ModuleNotFoundError: No module named 'text_tools'
Обычно main.py запускают не из каталога, где лежит text_tools.py, или файл назван иначе. Перейдите в папку проекта и повторите python main.py. Проверьте также, что редактор не сохранил файл как text_tools.py.txt.
ImportError: cannot import name ...
Имя после import не совпадает с именем функции. Сверьте normalize_text и shorten_text посимвольно. В Python регистр важен: shorten_text и Shorten_text — разные имена.
NameError: name 'MAX_TEXT_LENGTH' is not defined
В text_tools.py отсутствует строка from settings import MAX_TEXT_LENGTH или константа переименована в settings.py. Импорт должен стоять до определения функций.
SyntaxError: invalid syntax
Проверьте предыдущую строку: частая причина — пропущенная скобка, кавычка или двоеточие после def и if. Запустите python -m py_compile имя_файла.py, чтобы увидеть конкретный файл и номер строки.
Как понять, что файл пора отделять
Разделение на файлы полезно, когда у части кода появляется самостоятельная ответственность. В нашем примере интерфейс, обработка текста и настройки меняются независимо. Это проще тестировать, читать и переиспользовать.
- Вынесите функции, если они не зависят от
input()иprint(). - Вынесите настройки, если одно значение используется в нескольких модулях.
- Оставьте код в одном файле, если проект состоит из короткого одноразового скрипта.
- Не создавайте отдельный файл для каждой функции: большое число мелких модулей усложняет поиск кода.
Папка с файлами — ещё не пакет Python. Модуль1 — обычно отдельный файл с кодом, который можно импортировать. Пакет — структура для группировки модулей, обычно используемая в более крупных проектах. Для этого гайда пакета не требуется.
Что делать дальше
Добавьте тесты для normalize_text и shorten_text, не подключая терминал. Следующий полезный шаг — запускать проверку синтаксиса и тестов после каждого изменения. Когда модулей станет больше, группируйте их по предметной области, а не по случайному принципу «всё маленькое — в отдельный файл».
Создатель презентаций: Структура и текст каждого слайда: заголовки-утверждения, одна мысль на слайд, заметки докладчику.
Спросить за 150 ₽Источники: Python 3.12: Modules, Python 3.12: __name__ и пространство имён
Частые вопросы
Можно ли разделять код на файлы без пакета и виртуального окружения?
Почему в импорте не указывается расширение .py?
Что делать, если у меня Python другой версии?
Почему программа запускается сама при импорте?
Нужно ли создавать отдельный файл для каждой функции?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.