Тела функций скомпилированы в единый объект «код», который выполняется как единое целое - изменяя способ выполнения этого объекта кода, вставляя в него что-то, и такие вещи могут быть такими же сложными, как и сам код языка (т. е. код, который на самом деле «выполняет» байт-код Python).
Таким образом, любые изменения в потоке выполнения гораздо проще сделать с помощью операторов на языке, который уже это делает.
Есливам нужен эквивалент обобщенного декоратора по частям внутри тела функции; проще всего поделить эту функцию на внутренние функции - и затем вы можете применить свои преобразования или выполнить каждую часть более одного раза, просто вызывая ихфункций (и даже украшать их напрямую).
Однако, если вы зададите свой вопрос, вы можете и, вероятно, должны просто использовать простой старый цикл for
:
def foo():
for _ in (0, 1):
print("hello")
print("stack")
for _ in (0, 1):
print("overflow")
Для произвольного «поведения, подобного декоратору», как я писал выше, просто используйте вложенные функции:
def foo():
@deco_double
def part1()
print("hello")
print("stack")
part1()
@deco_double:
def part2():
print("overflow")
part2()