Подтвердить что ты не робот

Как получить возвращаемое значение при использовании Python exec для объекта кода функции?

В целях тестирования я хочу напрямую выполнить функцию, определенную внутри другой функции.

Я могу перейти к объекту кода дочерней функции через код (func_code) родительской функции, но когда я его выполню, я не получаю возвращаемого значения.

Есть ли способ получить возвращаемое значение из кода exec?

4b9b3361

Ответ 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).