Это можно сделать, но да, это становится "безобразным" - я однажды написал ленивый декоратор, который превращает любую функцию в "лениво вычисляемую функцию".
По сути, я обнаружил, что единственный момент, когда значение объекта фактически используется в Python, - это когда вызывается один из специальных методов "dunder". Например, если у вас есть число, его значение используется только в том случае, если вы используете его в другой операции или конвертируете в строку для ввода-вывода (в которой также используется метод «dunder»)
Итак, моя оболочка аннотирует параметры для вызова функции и возвращает специальный объект,
который потенциально имеет все «более грубые» методы. Когда вызывается один из этих методов, вызывается исходная функция, а затем ее возвращаемое значение кэшируется для дальнейшего использования.
Реализация здесь:
https://bitbucket.org/jsbueno/metapython/src/510a7d125b24/lazy_decorator.py
Извините за текст и большинство презентаций на португальском языке.