Call a function defined in another function

No, unless you return the function:

def func1():
    def func2():
        print("Hello")
    return func2

innerfunc = func1()
innerfunc()

or even

func1()()

You want to use @larsmans' solution, but theoretically you can cut yourself into the code object of the locally accessible func1 and slice out the code object of func2 and execute that:

#!/usr/bin/env python

def func1():
    def func2():
        print("Hello")

# => co_consts is a tuple containing the literals used by the bytecode
print(func1.__code__.co_consts)
# => (None, <code object func2 at 0x100430c60, file "/tmp/8457669.py", line 4>)

exec(func1.__code__.co_consts[1])
# => prints 'Hello'

But again, this is nothing for production code.

Note: For a Python 2 version replace __code__ with func_code (and import the print_function from the __future__).

Some further reading:

  • http://web.archive.org/web/20081122090534/http://pyref.infogami.com/type-code
  • http://docs.python.org/reference/simple_stmts.html#exec
  • http://lucumr.pocoo.org/2011/2/1/exec-in-python/