В эти выходные я разрывал на куски Michele Simionato's decorator module, который строит декораторы, сохраняющие подпись. В основе всего этого есть динамически функция, которая работает что-то похожее на это ...инструкция exec с/без предварительного компиляции
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? Я пробовал, но не мог заставить это работать ...
Как насчет производительности? Кажется, что компиляция быстрее по какой-то причине? – Radu
Я не уверен. Я бы предположил, что 'compile' будет быстрее, если вы вызываете' exec' несколько раз с тем же источником. 'exec', вызываемый со строкой, скомпилирует строку в байтовый код и затем выполнит ее. Компиляция будет происходить при каждом вызове. –