У pathlib.Path оператор / перегружен методом truediv: он соединяет компоненты пути, а не делит числа. Выражение сначала строит путь, затем проверяет его присутствие в path.parents.
Почему оператор «/» работает с pathlib, хотя это оператор деления
У 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. Это не универсальная проверка доступа: важны направление сравнения, нормализация, симлинки и возможная подмена пути между проверкой и открытием.