Получение функции ast перед компиляцией - PullRequest
0 голосов
/ 23 января 2019

Типичные декораторы Python

  • получают декорированную, скомпилированную функцию или class в качестве аргумента
  • обрабатывают ее
  • возвращение изменено или упаковано, скомпилировано функция или класс

например, :

def decorate(f):
    print("wrapping {}".format(f.__name__))
    def wrapper():
        print("executing {}".format(f.__name__))
        f()
    return wrapper

@decorate
def f():
    print("here is f")
# wrapping f

f()
# executing f
# here is f

Ради (чистого, чистого, безопасного, клянусь) ради эксперимента и любопытства интересно, существует ли что-то вроде декоратора python, который вместо этого

  • получает / обрабатывает / возвращает литеральный питон script или AST , перед фактически скомпилировано в байт-код.

Так что редактирование может быть выполнено в классе или функциискрипт во время оформления.

например :

import ast

def hook_decorate(tree):
    print("editing ast {}".format(ast.dump(tree)))
    tree.body[0].value.n = 8
    print("to {}".format(ast.dump(tree)))
    print("before compilation.")
    return tree

@hook_decorate
def f():
    a = 5
    print(a)
# editing ast Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Num(n=5)), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[]))])
# to Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Num(n=8)), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[]))])
# before compilation.

f()
# 8

Возможно ли это?Если да, то как?
Другими словами: как мне перехватить процедуру интерпретации определения функции (синтаксический анализ, компиляция)?


[ОБНОВЛЕНИЕ]: я знаю, что возможно проанализироватьвесь файл модуля для @hook_decorate токенов и обработайте соответствующий ast перед его фактическим импортом.Но это не совсем то же самое.

...