2010-02-03 15 views
9

Estoy trabajando en Python Interactive Shell (ActiveState ActivePython 2.6.4 en Windows XP). Creé una función que hace lo que quiero. Sin embargo, he borrado la pantalla, así que no puedo volver atrás y mirar la definición de la función. También es una función multilínea, por lo que la flecha hacia arriba para volver a mostrar las líneas tiene un valor mínimo. ¿Hay alguna forma de devolver el código real de la función? Existen los atributos "code" y "func_code" mostrados por dir(), pero no sé si contienen lo que necesito.Definición de función de pantalla en shell interactivo

+1

Le sugerí que utilice la función "ayuda", pero luego me di cuenta de que desea el código real en la función, no solo su firma. –

+0

Me gustaría obtener todo el código que he escrito en la consola como un archivo pero en cuanto a las respuestas que recibió no es posible ... sad –

Respuesta

8

No, __code__ y func_code son referencias al bytecode compilado: puede desensamblarlos (consulte dis.dis) pero no volver al código fuente de Python.

Por desgracia, el código fuente es simplemente desaparecido, no recordaba a ninguna parte ...:

>>> import inspect 
>>> def f(): 
... print 'ciao' 
... 
>>> inspect.getsource(f) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 694, in getsource 
    lines, lnum = getsourcelines(object) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 683, in getsourcelines 
    lines, lnum = findsource(object) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 531, in findsource 
    raise IOError('could not get source code') 
IOError: could not get source code 
>>> 

Si inspect no pueden llegar a ella, que es una indicación bastante indicativa.

Si estuvieras en una plataforma usando GNU readline (básicamente, cualquier excepto Windows), que podrían ser aprovechadas por el hecho de que readlinequé recordar algunos "historia" y puede escribirlo en un archivo ... :

>>> readline.write_history_file('/tmp/hist.txt') 

y luego leer ese archivo de la historia - sin embargo, sé de ninguna manera de hacer esto en Windows.

Es posible que desee utilizar algunos IDE con mejores capacidades de memoria, en lugar del intérprete de comandos "en bruto", especialmente en una plataforma como Windows.

+0

Estoy de acuerdo con el IDE.Pero el caparazón parece una ventana de comandos de DOS y el PHB no pregunta qué estoy haciendo. –

+0

tal vez esta es una buena solicitud de función para inactivo ... –

+0

ipython puede ayudar con un IDE rico en una ventana de comandos de DOS, ver http://ipython.scipy.org/moin/ - es tan rico que he perdido la noción de la mayoría de sus características por ahora ;-). –

0

A menos que exista una forma de hacerlo en el shell de estado activo, no, no hay forma de recuperar el código exacto que ha escrito en el intérprete de comandos. Al menos en Linux, usando Python Shell proporcionado por CPython no hay una forma especial de lograr esto. Tal vez usando iPython.

El atributo func_code es un objeto que representa la función bytecode, lo único que se puede obtener de este objeto es bytecode en sí, no el código "original".

+0

En Linux, 'readline.write_history_file' ayudaría, pero no en Windows. –

1

No, realmente no. Puede escribir sufunc.func_code.co_code (el bytecode realmente compilado) en un archivo y luego intente usar decompyle o unpyc para descompilarlos, pero ambos proyectos son viejos y no se han mantenido, y nunca han soportado la descompilación muy bien.

Para comenzar, es infinitamente más fácil simplemente escribir su función en un archivo.

2

Ha pasado bastante tiempo pero alguien puede necesitarlo. getsource da el código fuente:

>>> def sum(a, b, c): 
... # sum of three number 
... return a+b+c 
... 
>>> from dill.source import getsource 
>>> 
>>> getsource(sum) 
'def sum(a, b, c):\n # sum of three number\n return a+b+c\n' 

para instalar dill plazo pip install dill. Para formatearlo:

Cuestiones relacionadas