Как я могу вызвать внутреннюю функцию из оболочки Python? - PullRequest
2 голосов
/ 18 сентября 2010

У меня есть некоторый код (который я не могу легко изменить), следующей формы:

def foo(x):
   do_other_stuff_that_I_do_not_want_to_do()
   def bar():
      "do something"
      str(x)
   bar()

Я бы хотел вызвать bar() напрямую из оболочки Python. Я не против использования co_globals или других внутренних битов. У меня есть ощущение, что это может быть невозможно; это 1006 *

1 Ответ

4 голосов
/ 18 сентября 2010

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

Кроме того, обратите внимание, что внешние функции, такие как foo, часто кодируются в , возвращая внутреннюю функцию в качестве результата (например, путем изменения bar() на return bar) в качестве последней строки, точно работать как «фабрики функций» (часто как «фабрики замыкания») вместо того, чтобы сохранять само существование внутренней функции как своего рода частную, секретную деталь реализации; но ваша кодировка выбирает последний путь.

Редактировать ...:

Это можно получить в код объект для внутренней функции, однако:

>>> def outer():
...   def inner(): return 'boo'
...   print inner()
... 
>>> eval(outer.func_code.co_consts[1])
'boo'
>>> 

Однако, в целом, для превращения объекта кода в вызываемую функцию требуется значительная работа (в этом особом случае достаточно eval, потому что внутренняя функция не имеет ни аргументов, ни нелокальных переменных, но, конечно, это не везде, даже близко к общему случаю ... в котором вы должны предоставить такие тонкости, как привязки для нелокальных элементов! -)

...