В общем, то, что вы спрашиваете, невозможно (с результатами, которые вы, несомненно, ожидаете).Например, представьте, что «любой код» - это x = 23
.Это добавит новую переменную x
к набору локальных переменных вашего вызывающего, если вы найдете черный магический способ выполнения этого кода "в вызывающем"?Нет, не будет - критическая оптимизация , выполняемая компилятором Python, заключается в том, чтобы раз и навсегда определить при выполнении def
точный набор локальных переменных (все назначенные голые имена илив противном случае привязывается в теле функции) и превращает каждый доступ и настройку к этим голым именам в очень быструю индексацию в стеке.(Вы могли бы систематически побеждать эту критически важную оптимизацию, например, имея exec ''
в начале каждого возможного вызывающего абонента - и в результате вы видели, как падает производительность вашей системы через пол).
За исключением для присвоения локальным именам вызывающего абонента, exec thecode in thelocals, theglobals
может делать примерно то, что вы хотите, а модуль inspect
позволяет вам получить локальные и глобальные значения вызывающего абонента почти разумным способом (насколько это возможно).как глубокая чёрная магия - которая заставила бы меня сойти с ума по любому сотруднику, предложившему его использовать в производственном коде - может быть удостоена незаслуженной похвалы, называя ее «полуразумной», то есть; -).
Но вы указываете: «Я хочу выполнять любой код».и единственное решение , что однозначная спецификация (и спасибо за точность, которая облегчает ответ!), заключается в следующем: тогда используйте другой язык программирования.