Написать класс macro со следующими свойствами:
@macro — декоратор, который «превращает функцию в макрос» (см. пояснения далее). Получившаяся функция должна продолжать работать.
@macro() — декоратор, «раскрывающий макросы» в функции: заменяет в ней все макровызовы конструкции вида макрос(фактические параметры) на тело макроса, в котором вместо формальных параметров подставлены фактические
Для простоты соблюдаются следующие требования:
Макрос работает с исходным текстом функции посредством inspect.getsource()
Функция под декоратором @macro имеет только позиционные параметры и состоит из единственного оператора return выражение (то есть практически именованная labmda)
Вложенных макросов ни в макроопределениях, ни в макроподстановках нет (т. е. нельзя написать macro1(macro2(…))
- Вложенных декораторов (вообще других декораторов) тоже нет
- Переопределять макрос нельзя (определять несколько — можно)
27 10
Подсказка 1: я пользовался ast.parse() / ast.NodeTransformer / ast.unparse(). Текст функции calculate превратился в:
Подсказка 2: в своём решении я применял ast.NodeTransformer трижды: для удаления декораторов из исходных текстов функций, для подмены в копии тела макроса формальных параметров фактическими и для макроподстановки в декорируемой функции