Посмотрите на места, где код хранит значения в кеше. Он может хранить два различных типа значений в cache[filename]
:
- 4 кортежа размера, времени мода, списка строк и имени ( здесь и здесь ).
- 1-кортеж функции, которая возвращает список строк по запросу ( здесь ).
1-кортеж используется для настройки отложенной загрузки модулей. Обычные файлы, чтобы их лениво загружать, вы просто open
и read
. Но источник модуля может быть доступен из загрузчика модуля (найден через систему импорта), но недоступен только при открытии и чтении файла, например, zipimport
модулей. Так что lazycache
должен спрятать метод загрузчика get_source
, поэтому, если позже ему понадобятся строки, он может их получить.
И это означает, что всякий раз, когда использует эти значения кэша, он должен проверять, какого рода он хранится, и делать разные вещи. Если ему нужны строки сейчас, и у него есть ленивый 1-кортеж, он должен загрузить строки (через updatecache
; если он проверяет на удаление кэша и находит ленивый кортеж, который никогда не оценивался, он сбрасывает его; и т.д.
Также обратите внимание, что в updatecache
, если он загружает файл из ленивого 1-го кортежа, у него нет времени модификации, что означает, что в checkcache
он не может проверить, устарел ли файл , Но это хорошо для источника модуля - даже если вы измените файл, старая версия все еще остается той, которая import
ed и используется.
Если бы вы разрабатывали это с нуля, а не взламывали что-то, что было в stdlib с ранних 1.x темных веков, вы, вероятно, разработали бы это совсем по-другому. Например, вы можете использовать класс или два класса, реализующих один и тот же интерфейс.
Также обратите внимание, что огромный кусок кода в linecache
предназначен для решения особых случаев, связанных с загрузкой исходного кода модуля, если вы не пытаетесь создать что-то, что отражается в коде Python (как это делает traceback
), вам не нужно ничего из. (И даже если вы делаете , вы, вероятно, захотите использовать модуль inspect
вместо непосредственного общения с системой импорта.)
Таким образом, linecache
может быть не лучшим примером кода, на котором будет основан ваш собственный строковый кеш.