Глава 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"
>>> fajl.name
'otchet.pdf'
>>> fajl.suffix
'.pdf'
>>> fajl.stem
'otchet'
>>> fajl.parent
PosixPath('/home/anna/Downloads')
Оператор / для путей
У класса 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, без установки
Открыть практику →
Официальная документация
pathlib — Object-oriented filesystem paths
dataclasses