Python не выполняет встроенных вызовов функций из-за своей динамической природы. Теоретически, inner_function
может сделать что-то, что связывает имя inner_function
с чем-то другим - у Python нет способа узнать, что это может произойти во время компиляции. Например:
def func1():
global inner_func
inner_func = func2
print 1
def func2():
print 2
inner_func = func1
for i in range(5):
inner_func()
Печать:
1
2
2
2
2
Вы можете подумать, что это ужасно. Затем подумайте еще раз: функциональность и динамичность Python - одна из его наиболее привлекательных особенностей. Многое из того, что позволяет Python, достигается за счет производительности, и в большинстве случаев это приемлемо.
Тем не менее, вы, вероятно, можете взломать что-то вместе, используя инструмент, подобный byteplay или подобный - разберите внутреннюю функцию на байт-код и вставьте ее во внешнюю функцию, затем соберите заново. Если подумать, если ваш код достаточно критичен для производительности, чтобы оправдать подобные взломы, просто перепишите его на языке C. В Python есть отличные возможности для FFI.
Это все относится к официальной реализации CPython. Интерпретатор JITting во время выполнения (например, PyPy или печально несуществующая Unladen Swallow) теоретически может обнаружить нормальный случай и выполнить встраивание. Увы, я не достаточно знаком с PyPy, чтобы знать, делает ли он это, но определенно может.