В принципе, вы можете создать новую функцию, используя тот же код, что и старый, но заменив глобальную область видимости измененной:
import new
def with_bar(func):
def bar(x):
return x + 1
f_globals = func.func_globals.copy()
f_globals['bar'] = bar
return new.function(func.func_code, f_globals,
func.func_name, func.func_defaults, func.func_closure)
@with_bar
def foo(x):
return bar(x)
print foo(5) # prints 6
На практике вы действительно должны найти лучший способ сделать это. Передача функций в качестве параметров является одним из вариантов. Могут быть и другие подходы, но трудно сказать, что подойдет, без описания проблемы высокого уровня.