Мне может потребоваться выполнить многократное чтение по большой базе кода и с использованием различных инструментов.
Затем я подумал, что это реальная трата, чтобы читать на диске так много раз, пока текст не изменится, поэтому я написал следующее.
class Module(object):
def __init__(self, module_path):
self.module_path = module_path
self._text = None
self._ast = None
@property
def text(self):
if not self._text:
self._text = open(self.module_path).read()
return self._text
@property
def ast(self):
s = self.text # which is actually discarded
if not self._ast:
self._ast = parse(self.text)
return self._ast
class ContentDirectory(object):
def __init__(self):
self.content = {}
def __getitem__(self, module_path):
if module_path not in self.content:
self.content[module_path] = Module(module_path)
return self.content[module_path]
Но теперь возникает проблема, потому что я хотел бы избежать изменения остальной части кода, в то же время имея возможность использовать этот новый трюк.
Единственный способ, которым я вижу, - это исправлять встроенную функцию open везде, где ее можно использовать, например.
from myotherlib import __builtins__ as other_builtins
other_builtins.open = my_dummy_open # which uses this cache
Но на самом деле это не похоже на мудрую идею.
Должен ли я просто сдаться и попытаться, если производительность действительно слишком плохая, может быть?