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/