Рассмотрим следующий код:
def CalcSomething(a):
if CalcSomething._cache.has_key(a):
return CalcSomething._cache[a]
CalcSomething._cache[a] = ReallyCalc(a)
return CalcSomething._cache[a]
CalcSomething._cache = { }
Это самый простой способ, который я могу представить для моделирования "локальной статической" переменной в python.
Меня беспокоит то, что CalcSomething._cache упоминается вне определения функции, но альтернативой было бы что-то вроде этого:
if not hasattr(CalcSomething, "_cache"):
setattr(CalcSomething, "_cache", { } )
внутри определения функции, которое действительно громоздко.
Есть ли более элегантный способ?
[EDIT]
Просто для выяснения этого вопроса речь идет не о локальных кешах функций, как может показаться вышеприведенный пример. Вот еще один короткий пример, где "статический локальный" может быть удобным:
def ParseString(s):
return ParseString._parser.parse(s)
# Create a Parser object once, which will be used for all parsings.
# Assuming a Parser object is heave on resources, for the sake of this example.
ParseString._parser = Parser()