Почему оператор «/» работает с pathlib, хотя это оператор деления

У pathlib.Path оператор / перегружен методом __truediv__: он соединяет компоненты пути, а не делит числа. Выражение сначала строит путь, затем проверяет его присутствие в path.parents.

Короткий ответ

Что ответить на собеседовании

У pathlib.Path оператор / перегружен методом truediv: он соединяет компоненты пути, а не делит числа. Выражение сначала строит путь, затем проверяет его присутствие в path.parents.

Подробный разбор

Ответ с пояснениями

Условие

Разъясните, как работает выражение с «/», несмотря на то, что в Python этот символ обычно обозначает деление, и что происходит в процессе.

app_model = ...

# app_model.path: pathlib.Path
# app_model.path = pathlib.Path("/home/user/app/")
# ALLOWED_PATH = "dir1/dir2"

if app_model.path / ALLOWED_PATH not in path.parents:
    raise django.core.exceptions.PermissionDenied()

Ответ

У pathlib.Path оператор / перегружен методом truediv: он соединяет компоненты пути, а не делит числа. Выражение сначала строит путь, затем проверяет его присутствие в path.parents.

Для Path('/home/user/app') / 'dir1/dir2' получается путь /home/user/app/dir1/dir2. Эта операция сама не обращается к файловой системе. Абсолютная правая часть может отбросить левую, поэтому пользовательский ввод нельзя считать безопасным только из-за применения /.

В примере path должен быть определён отдельно, иначе возникнет NameError. Проверка ищет построенный путь среди родителей path и исключает равенство самому path. Это не универсальная проверка доступа: важны направление сравнения, нормализация, симлинки и возможная подмена пути между проверкой и открытием.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее