2011-04-24 9 views
18

Al tratar de utilizar la instrucción "ejecutivo" de Python, tengo el siguiente error:¿Qué es un objeto de código Python?

TypeError: exec: arg 1 must be a string, file, or code object 

que no quieren pasar una serie o un archivo, pero lo que es un objeto de código, y cómo lo ¿crea uno?

+10

¿Por qué utiliza exec? ¿Y qué pasa con pasar una cadena o archivo? –

Respuesta

25

Una forma de crear un objeto de código es utilizar compile función incorporada:

>>> compile('sum([1, 2, 3])', '', 'single') 
<code object <module> at 0x19ad730, file "", line 1> 
>>> exec compile('sum([1, 2, 3])', '', 'single') 
6 
>>> compile('print "Hello world"', '', 'exec') 
<code object <module> at 0x19add30, file "", line 1> 
>>> exec compile('print "Hello world"', '', 'exec') 
Hello world 

también, las funciones tienen el atributo de la función __code__ (también conocido como func_code en las versiones anteriores) desde donde se puede obtener el código objeto de función:

>>> def f(s): print s 
... 
>>> f.__code__ 
<code object f at 0x19aa1b0, file "<stdin>", line 1> 
+2

El bit que me desconcierta sobre la pregunta del OP (y la aceptación de esta respuesta) es que si van a pasar una cadena a 'compilar', la mayoría de las veces también pueden pasarlo directamente a' exec' y dejarlo 'exec' compila a un objeto de código detrás de las escenas. La única razón para llamar directamente a 'compile' es si la aplicación tiene una necesidad específica de separar los pasos de compilación y ejecución (por ejemplo, el mismo objeto de código puede invocarse más de una vez, o la verificación de sintaxis cuando se ingresa el código, incluso si no se ejecutará hasta más tarde). – ncoghlan

12

objetos de código se describen here:

Code objects represent byte-compiled executable Python code, or bytecode. The difference between a code object and a function object is that the function object contains an explicit reference to the function’s globals (the module in which it was defined), while a code object contains no context; also the default argument values are stored in the function object, not in the code object (because they represent values calculated at run-time). Unlike function objects, code objects are immutable and contain no references (directly or indirectly) to mutable objects.

14

Hay una excelente entrada en el blog de Dan Crosta explicar este tema, incluyendo cómo crear objetos de código de forma manual, y cómo desmontar de nuevo:

Exploring Python Code Objects

+0

¡Gracias por este blog! Ojalá hubiera un +2 de todos modos +1 – void

Cuestiones relacionadas