2012-04-18 14 views
7

En una sesión de IPython, generalmente defino funciones personalizadas ... el problema es que, a veces, quiero ver el código real para estas funciones. Hasta ahora, no he podido encontrar una manera de mostrar esto. Utilizando ? y ?? simplemente devuelve "Función generada dinámicamente. No hay código fuente disponible". ¿Hay alguna manera de mostrar el código fuente para las funciones definidas por el usuario?¿Cómo se muestra el código fuente para la función creada dinámicamente ("personalizada") en IPython?

+0

¿Qué crea la función "personalizada"? ¿Puede proporcionar alguna fuente que indique cómo los está creando? – kindall

+0

algo como: 'bla def (d, b): retorno (d> 10 y b <10)' (interactivamente definidas habría sido mejor, lo siento) –

+2

¿Qué versión de IPython tiene usted? En versiones recientes, 'f ??' funciona en funciones definidas interactivamente. –

Respuesta

2

Trata la historia de la búsqueda:

In [22]: for l in _ih: 
    ....:  if l.startswith('def f'): 
    ....:   print l 
    ....:   
    ....:   
def f(): 
    a= 1 
    b = 2 
    return a*b 

aunque esto es muy básico, una versión mejor sería analizar sintácticamente/historial de ejecución y ver si se puede conseguir una función de la espalda

2

Si usted está buscando la fuente de una función definida de forma interactiva-, se puede encontrar la más reciente definición de la misma en la historia de IPython:

[i for (i, l) in enumerate(_ih) if l.startswith('def foo(')][-1] 

a continuación, puede editar esa línea:

%edit 42 

Se abrirá el Bloc de notas u otro editor de texto con la definición de la función en él.

O puede guardar en un archivo:

%save foo.py 42 
+0

Esto funciona, aunque en este caso específico utilicé un% paste así que todo lo que mostró fue el comando de pegar mágico para esa línea. Buena solución de lo contrario, aunque –

2

estoy usando Python 2.7.4 y 0.13.2 IPython.

puedo ver el origen de una función dinámica creada en IPython usando ?? antes de que el nombre de la función:

In [8]: ??sort_words 
Type:  function 
String Form:<function sort_words at 0x189b938> 
File:  /tmp/ipython_edit_yc1TIo.py 
Definition: sort_words(s) 
Source: 
def sort_words(s): 
    x = re.findall(r'\W+(\w+)', s) 
    x.sort() 
    for i in x: 
     print i 

Tal vez esto ya está disponible en las versiones más recientes de IPython? Qué versión estás usando?

+0

sí, esto es correcto; Hice esta pregunta cuando (creo) 0.12 no era la versión estable, y esto no estaba disponible en 0.11. Ver el comentario de Thomas K sobre la pregunta –

0

Fumctions en IPython se consideran generadas dinámicamente si:

  • se metaprogrammed - Son creados por otra función. en este caso, no hay código fuente, simplemente no existe.

  • se les hace referencia en un espacio de nombre diferente para el que se crearon y no hay información en cuanto a qué espacio de nombres se encuentran originalmente. En este caso, averigüe dónde estaban originalmente y se ejecutan ?? desde allí.

+0

No estoy seguro de entender su caso "meta-programado": en IPython 1.1.0, se puede ver con '??' el código de funciones creado dentro de otra función ('def f(): def g(): ... return g'). – EOL

Cuestiones relacionadas