Глава 23 · Часть IV · Реализуем SafeSort

Настройки проекта

Файл настроек необязателен: без него в силу вступают встроенные значения по умолчанию, а с ним можно переопределить часть поведения.

SafeSort · Часть 4 из 6Реализация

Категории по умолчанию и каталог результата подходят для большинства случаев, но иногда их стоит настроить — например, разложенные файлы должны попадать не в Sorted/, а в каталог с другим именем. Без файла настроек SafeSort использует встроенные значения:

Встроенные значения по умолчанию (нигде в файле не записаны — это поведение программы)
destination = "Sorted"
exclude = [".git", ".venv"]

Чтобы изменить их, SafeSort ищет необязательный файл safesort.toml прямо в корне сканируемого каталога:

СитуацияЧто произойдёт
safesort.toml есть в корне каталогачитаем и применяем настройки
safesort.toml отсутствуетиспользуем встроенные значения по умолчанию
safesort.toml — переопределяет имя каталога результата и добавляет категорию
destination = "Organized"
exclude = [".git", ".venv"]

[extensions]
books = [".epub"]
Встроенныеdefaultsdocuments, images,video, audio,archives, code, datasafesort.tomlдобавляет новуюкатегорию илизаменяет только…Effective Configвсе остальныевстроенные категориисохраняются
Приоритет настроек: defaults → пользовательские additions/overrides → эффективная Config

Таблица [extensions] работает как overlay. Строка books = [".epub"] добавляет категорию books и не удаляет documents или images. Если пользователь явно задаст documents = [".md"], только список documents будет заменён.

safesort.toml остаётся входом конфигурации
Сканер всегда пропускает этот файл. После plan, apply и повторного запуска конфигурация остаётся в корне, поэтому следующий запуск получает те же настройки.
Ни одна команда SafeSort не требует файла настроек
Если safesort.toml не найден, в дело идут встроенные значения по умолчанию. Программа работает предсказуемо и без единой строчки настроек. Файл конфигурации переопределяет defaults, но не служит обязательным условием для запуска.

Чтение файла использует tomllib, модуль стандартной библиотеки Python для разбора TOML, доступный только на чтение:

src/safesort/config.py
def load_config(root: Path) -> Config:
    config_path = root / "safesort.toml"
    if not config_path.is_file():
        return Config()

    try:
        with config_path.open("rb") as handle:
            raw = tomllib.load(handle)
    except tomllib.TOMLDecodeError as exc:
        raise ConfigError(f"Could not parse config file {config_path}: {exc}") from exc
    # ...
tomllib.load() принимает открытый файл в бинарном режиме
Обратите внимание на open("rb"), а не open("r"): tomllib сам решает, как декодировать байты файла в текст согласно спецификации TOML, поэтому ожидает на входе именно бинарный поток, а не уже прочитанную строку.

Если файл настроек существует, но содержит некорректный TOML, SafeSort не пытается угадать намерение пользователя. Он поднимает понятную ошибку ConfigError с указанием файла и причины, вместо того чтобы либо упасть с трудночитаемой трассировкой, либо молча продолжить с настройками по умолчанию.

Практика: читаем и проверяем TOML-настройки
Интерактивный ноутбук в браузере: Python 3.14 через Pyodide, без установки
Открыть практику →
Официальная документация
tomllib — Parse TOML files
Чекпойнт · Issue #11
git commit -m "feat: add directory scanner and configuration"
Как и Issue #10, у этой задачи нет собственного PR: логирование и настройки попали в тот же коммит, что и сканер (PR #15), а Issue #11 закрыли вручную. Книга разносит logging (23-21) и safesort.toml (эта страница) по двум урокам, потому что это две разные идеи. В репозитории им соответствуют один Issue и один коммит.
Статус в реальном Project: Done