Существуют ли pythonic
способы поддержания состояния (например, для оптимизации) без полного объектно-ориентированного?
Чтобы лучше проиллюстрировать мой вопрос, вот пример шаблона, который я часто использую в JavaScript:
var someFunc = (function () {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
Внешне это просто функция, как и любая другая, без необходимости инициализировать объекты или что-то в этом роде, но закрытие позволяет вычислять значения за один раз, которые я тогда по существу использую в качестве констант.
Примером этого в Python является оптимизация регулярных выражений - полезно использовать re.compile
и хранить скомпилированную версию для операций match
и search
.
Единственными способами, которые я знаю для этого в Python, является установка переменной в области видимости модуля:
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
Или создав класс:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
Первый подход является ad-hoc, и не совсем ясно, что указанная выше функция и переменная связаны друг с другом. Он также сильно загрязняет пространство имен модулей, что я не слишком доволен.
Последний подход кажется многословным и немного тяжелым на шаблоне.
Единственный способ, с которым я могу придумать, - это включить любые функции, подобные этому, в отдельные файлы (модули) и просто импортировать функции, чтобы все было чисто.
Любые советы от более опытных Pythoners о том, как с этим бороться? Или вы просто не беспокоитесь об этом и продолжаете решать проблему?