Pathlib и проверка файлового пути с '..'

Pathlib и проверка файлового пути с '..'

@python_quiz

Разберем этот квиз

Коротко: в примере используется pathlib.Path с фрагментом пути '..'. В каталоге присутствует только файл data/app.log. Нам нужно понять, что выведет код при проверках p.exists() и p.is_file().

python

Разберёмся по шагам.

Что делает Path и как работают exists()/is_file()

  • Объект Path хранит сегменты пути буквально: конструкция Path('data') / 'logs' / '..' / 'app.log' содержит компонент '..'.
  • Операции exists() и is_file() при обращении к файловой системе учитывают семантику «..» — то есть файловая система интерпретирует путь, сворачивая переходы вверх по дереву, и итоговый доступ проверяет уже нормализованный путь.
  • Таким образом, если итоговый (нормализованный) путь указывает на существующий файл, оба метода вернут True: exists() — путь существует, is_file() — это обычный файл.

Важно: Path.resolve() может показать нормализованный абсолютный путь. Чтобы не вызывать ошибки в старых версиях Python, можно использовать resolve(strict=False).

Демонстрация (ожидаемый вывод)

Пример с выводом промежуточных значений:

python

При условии, что на диске действительно есть файл data/app.log, вывод будет примерно:

  • raw: data/logs/../app.log
  • resolved: /полный/путь/до/data/app.log
  • exists, is_file: True True

Анализ вариантов ответов

Рассмотрим логически каждый из предложенных вариантов вывода:

  • "True True" — соответствует ситуации, когда нормализованный путь указывает на существующий файл. Это и происходит в условии (есть data/app.log).
  • "False False" — означало бы, что итоговый путь не существует и не является файлом; не подходит, так как файл присутствует.
  • "False True" — противоречивый вариант: как правило exists() возвращает True для обычного файла, и is_file() не станет True, если exists() False (исключение — редко какие-то странные файловые метаданные, но в обычной POSIX/Windows среде это невозможно).
  • "True False" — могло бы возникнуть, если путь существует, но является, например, директорией; в нашем случае итоговый путь — обычный файл, значит этот вариант тоже не подходит.

Итог

При наличии на диске файла data/app.log вызовы p.exists() и p.is_file() вернут True True. Path сам по себе может хранить '..' в представлении, но проверки обращаются к реальному (нормализованному) пути в файловой системе.

Дополнительные замечания

  • is_file() возвращает True для обычного файла (следует символическим ссылкам, указывающим на файл).
  • exists() вернёт False для сломанной символической ссылки (symlink, указывающий на несуществующий объект).
  • Если нужно увидеть нормализованный абсолютный путь без ошибки при отсутствии целевого файла, используйте p.resolve(strict=False).

Report Page