В эти выходные я разбираю на куски модуль Мишеля Симонато , который создает декораторы, сохраняющие подпись. В основе всего этого лежит динамически генерируемая функция, которая работает примерно так ...
src = """def function(a,b,c) :\n return _caller_(a,b,c)\n"""
evaldict = {'_caller_' : _caller_}
code = compile(src, '<string>', 'single')
exec code in evaldict
new_func = evaldict[function]
Я обнаружил, шутя с этим кодом, что шаг компиляции можно полностью избежать и перейти к одному:
exec src in evaldict
Теперь я уверен, что есть веская причина для этого дополнительного шага, но я не смог найти разницу между этими двумя подходами. Производительность
И поскольку я спрашиваю, можно ли с помощью eval добиться чего-то подобного, то есть определить новую функцию и получить к ней дескриптор? Я пытался, но не мог заставить это работать ...