Зачем читать исходники стандартной библиотеки
Я как-то писал, что в документацию питона добавили ссылки на исходники модулей. Читать их не только увлекательно, но и полезно.
Помните linecache.getline()
из прошлого поста, который выбирает строчку файла по номеру?
>>> linecache.getline("answers.txt", 3)
'Проверили, проблема на вашей стороне'
Модуль не случайно называется linecache
. При первом обращении к файлу linecache
записывает его содержимое в кеш (в глобальную переменную cache
). Именно из кеша getline()
и выбирает строку по номеру. Благодаря кешу второй и следующие вызовы уже не читают файл и отрабатывают моментально.
# lines - список строк файла
cache[filename] = size, mtime, lines, fullname
И есть в модуле функция linecache.checkcache()
. Вот её документация:
Check the cache for validity. Use this function if files in the cache may have changed on disk, and you require the updated version.
Вроде понятно, проверяет и актуализирует кеш. А вот как выглядит исходник функции:
def checkcache(filename=None):
# проверка, обновился ли файл
# по сравнению с кешем
# и если обновился, то:
cache.pop(filename)
Оказывается, checkcache()
не актуализирует, а очищает кеш! Из-за этого следующий вызов getline()
отработает заметно медленнее: придётся заново начитывать весь файл.
В случае с linecache
это вряд ли станет большой проблемой, но представьте, какой был бы неприятный сюрприз, если бы речь шла о продакшен-кеше вашего приложения ツ
В любой непонятной ситуации читай исходники, как говорил Урбан Мюллер, автор языка Brainfuck.
★ Подписывайтесь на новые заметки.