Документация для модуля os
дает следующее утверждение:
Примечание
Использование доступа () для проверки, авторизован ли пользователь дляНапример, откройте файл перед тем, как сделать это, используя open (), создайте дыру в безопасности, потому что пользователь может использовать короткий промежуток времени между проверкой и открытием файла для манипулирования им.Предпочтительно использовать EAFP методики.Например:
if os.access("myfile", os.R_OK):
with open("myfile") as fp:
return fp.read()
return "some default data"`
лучше записать как:
try:
fp = open("myfile")
except PermissionError:
return "some default data"
else:
with fp:
return fp.read()
Я не понимаю, как пользователь «может использовать» интервал.Если бы open
собирался вызвать исключение, я не уверен, как os.access
предотвратит возникновение этого исключения.Аналогично, если пользователь каким-либо образом манипулирует файлом, почему бы не выполнить манипулирование файлом до выполнения команды open
версии EAFP?
Я понимаю, что вторая версия может быть более надежной, поскольку os.access
может дать сбойправильно распознать условие, которое может вызвать PermissionError
, но я не вижу, как версия LBYL менее безопасна .Может кто-нибудь объяснить это?