Глава 23 · Часть IV · Реализуем SafeSort
pathlib: работаем с путями и каталогами
Path описывает путь объектом со своими операциями. На нём строится модель данных SafeSort.
SafeSort · Часть 4 из 6
Git и GitHub→Планирование→Проект→Реализация→Тесты и CI→Релиз
Всё, что SafeSort делает с файлами, начинается с путей. Модуль
pathlib из стандартной библиотеки описывает путь не строкой, а
объектом Path с собственными операциями.
| Строка | Path |
|---|---|
| "/home/anna/Downloads/report.pdf" | Path("/home/anna/Downloads/report.pdf") |
| ручной разбор через .split('/') | готовые атрибуты fajl.parent, fajl.name, fajl.suffix, fajl.stem |
| конкатенация строк для соединения путей | оператор / собирает путь: koren / 'report.pdf' |
pathlib_osnovy.py
from pathlib import Path
koren = Path("~/Downloads").expanduser()
fajl = koren / "otchet.pdf"
Оператор / для путей
У класса
Path переопределён оператор /: он не делит числа, а склеивает часть пути с новым именем, автоматически подставляя правильный разделитель для текущей операционной системы. Собирать пути строковой конкатенацией (koren + "/" + "otchet.pdf") не нужно.Модель данных SafeSort: FileInfo
Сканер SafeSort не ограничивается списком путей. Он описывает каждый найденный файл небольшим неизменяемым объектом:
src/safesort/models.py
@dataclass(frozen=True)
class FileInfo:
path: Path
size: int
extension: str
frozen=True запрещает переназначать поля уже созданного
FileInfo. Это свойство объекта-значения, а не
защита файловой системы. Функция может получать frozen-объект и всё равно записывать
файлы, обращаться к сети или выполнять другие побочные эффекты.
Неизменяемые данные не означают чистую функцию
build_plan() не меняет диск по отдельному контракту: API возвращает план, реализация не вызывает move/write, а тест проверяет отсутствие изменений. frozen=True лишь не даёт переназначить поля модели. Это разные границы, и обе нужны.Практика: операции с Path
Интерактивный ноутбук в браузере: Python 3.14 через Pyodide, без установки