Есть ли способ написания декоратора, который бы работал следующим образом?
assert 'z' not in globals()
@my_decorator
def func(x, y):
print z
РЕДАКТИРОВАТЬ: перенесено из anwser
В ответ на хоп "почему?": Синтаксис sugar / DRY.
Речь идет не о кэшировании, а о вычислении z (и z1, z2, z3, ...) на основе значений x & y.
У меня есть много функций, которые делают связанные вещи, и я не хочу, чтобы я написал
z1, z2, z3=calculate_from(x, y)
в начале каждой функции - где-то я ошибаюсь. Если бы это было c, я бы сделал это с помощью cpp (если бы это был lisp, я бы сделал это с макросами ...), но я хотел посмотреть, могут ли декораторы сделать то же самое.
Если бы это помогло, я бы почти наверняка назвал декоратор «precalculate_z», и он определенно не был бы частью какого-либо публичного API.
Вероятно, я мог бы получить аналогичный эффект от использования инфраструктуры классов, но я хотел посмотреть, выполнимо ли это с необработанными функциями.