Llamar a una función definida en otra función.

¿Puedo llamar a una función anidada dentro de otra función del scope global en python3.2?

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

¿Hay alguna forma de llamar a func2 () desde fuera de func1 ()?

No, a menos que devuelvas la función:

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

o incluso

 func1()() 

Desea utilizar la solución de @larsmans , pero teóricamente puede cortarse en el objeto de código de la func1 accesible localmente y cortar el objeto de func2 de func2 y ejecutar eso:

 #!/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, ) exec(func1.__code__.co_consts[1]) # => prints 'Hello' 

Pero de nuevo, esto no es nada para el código de producción .

Nota: Para una versión de Python 2, reemplace __code__ con func_code (e importe la print_function de print_function desde el __future__ ).

Algunas lecturas adicionales:

  • 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/

Esto se basa en la solución de eyquem.

 def func1(): global func2 # put it in global scope def func2(): print("Hello") 

Ahora puedes invocar func2 directamente.

Pero habría que llamar a func1 () antes de poder llamar a func2 (), de lo contrario no se habrá definido aún.

 def func1(): def func2(): global fudu fudu = func2 print("Hello") func2() func1() fudu() print 'fudu' in dir() print 'func2' in dir() 

resultado

 Hello Hello True False 

También:

 def func1(): global func2 def func2(): print("Hello") func2() func1() print 'func2' in dir() func2() 

resultado

 Hello True Hello 

¿Cuál es el interés?

.

Editar

¿Por qué mi respuesta fue rechazada?

No creo que mi respuesta tenga un gran interés, pero el hecho es que también me pregunto cuál es la motivación de la pregunta y no veo ningún interés en resolver el problema planteado.