En Python, tengo una cadena de código fuente de Python que contiene funciones como:
mySrc = ''' def foo(): print("foo") def bar(): print("bar") '''
Me gustaría comstackr esta cadena en algún tipo de objeto similar a un módulo para poder llamar a las funciones contenidas en el código.
Aquí hay un pseudocódigo para lo que me gustaría hacer:
myMod = myCompile(mySrc) myMod.foo()
¿Es esto posible en Python? He intentado esto, pero no funciona:
myMod = compile(mySrc, '', 'exec') myMod.foo()
Esto produce un mensaje de error como este:
<code object at 0x104154730, file "", line 1>Traceback (most recent call last): File "myfile.py", line XX, in run myMod.foo() AttributeError: 'code' object has no attribute 'foo'
Tienes que comstackrlo y ejecutarlo a la vez:
myMod = compile(mySrc, '', 'exec') exec(myMod) foo()
Puede pasar los dados a exec
para evitar que foo
escape. types.ModuleType
con un objeto de módulo creado utilizando types.ModuleType
:
from types import ModuleType … compiled = compile(mySrc, '', 'exec') module = ModuleType("testmodule") exec(compiled, module.__dict__)
En Python 2, quieres el paquete del comstackdor mágico:
>>> import compiler >>> mod = compiler.parseFile("doublelib.py") >>> mod Module('This is an example module.\n\nThis is the docstring.\n', Stmt([Function(None, 'double', ['x'], [], 0, 'Return twice the argument', Stmt([Return(Mul((Name('x'), Const(2))))]))])) >>> from compiler.ast import * >>> Module('This is an example module.\n\nThis is the docstring.\n', ... Stmt([Function(None, 'double', ['x'], [], 0, ... 'Return twice the argument', ... Stmt([Return(Mul((Name('x'), Const(2))))]))])) Module('This is an example module.\n\nThis is the docstring.\n', Stmt([Function(None, 'double', ['x'], [], 0, 'Return twice the argument', Stmt([Return(Mul((Name('x'), Const(2))))]))])) >>> mod.doc 'This is an example module.\n\nThis is the docstring.\n' >>> for node in mod.node.nodes: ... print node ... Function(None, 'double', ['x'], [], 0, 'Return twice the argument', Stmt([Return(Mul((Name('x'), Const(2))))])) >>> func = mod.node.nodes[0] >>> func.code Stmt([Return(Mul((Name('x'), Const(2))))])
Y en Python 3, está incorporado .