Как получить возвращаемое значение при использовании Python exec для объекта кода функции?
В целях тестирования я хочу напрямую выполнить функцию, определенную внутри другой функции.
Я могу перейти к объекту кода дочерней функции через код (func_code) родительской функции, но когда я его выполню, я не получаю возвращаемого значения.
Есть ли способ получить возвращаемое значение из кода exec?
Ответы
Ответ 1
Да, вам нужно иметь назначение в инструкции exec
:
>>> def foo():
... return 5
...
>>> exec("a = foo()")
>>> a
5
Это, вероятно, не имеет отношения к вашему делу, поскольку он используется в контролируемом тестировании, но будьте осторожны с использованием exec
с пользовательским вводом.
Ответ 2
Что-то вроде этого может работать:
def outer():
def inner(i):
return i + 10
for f in outer.func_code.co_consts:
if getattr(f, 'co_name', None) == 'inner':
inner = type(outer)(f, globals())
# can also use `types` module for readability:
# inner = types.FunctionType(f, globals())
print inner(42) # 52
Идея состоит в том, чтобы извлечь объект кода из внутренней функции и создать на нем новую функцию.
Требуется дополнительная работа, когда внутренняя функция может содержать свободные переменные. Вам также придется извлечь их и перейти к конструктору функции в последнем аргументе (closure
).