2009-10-13 20 views
66

En JavaScript, se puede imprimir la definición de una función. ¿Hay alguna manera de lograr esto en Python?¿Puede Python imprimir una definición de función?

(Solo jugaba en modo interactivo, y quería leer un módulo sin abrir(). Tenía curiosidad).

+0

Usted tiene la fuente de la función. ¿Qué está mal con eso? –

+0

Y desde el modo interactivo puede usar la ayuda (función) para visualizar la cadena de documentación para la función. – monkut

+0

Hay un duplicado de esta pregunta: http://stackoverflow.com/questions/427453/how-can-i-get-the-source-code-of-a-python-function –

Respuesta

93

Si va a importar la función, puede utilizar inspect.getsource:

>>> import re 
>>> import inspect 
>>> print inspect.getsource(re.compile) 
def compile(pattern, flags=0): 
    "Compile a regular expression pattern, returning a pattern object." 
    return _compile(pattern, flags) 

Este se trabajo en el modo interactivo, pero al parecer sólo en los objetos que se importan (no objetos definidos en el modo interactivo) . Y, por supuesto, sólo funcionará si Python puede encontrar el código fuente (lo que no en los objetos incorporados, bibliotecas, archivos C .pyc, etc.)

+0

Las funciones que se crean en tiempo de ejecución (incluido el aviso interactivo) tampoco tienen un archivo o un número de lienzo, lo que tiene sentido –

+0

Parece ser lo que estaba buscando. ¡Gracias! –

+6

¿Qué tal imprimir una definición de función que definí anteriormente en el intérprete interactivo actual de Python? es posible? – GL2014

64

Si está utilizando iPython, puede utilizar function_name? a pedir ayuda, y function_name?? imprimirá la fuente, si se puede.

+3

+1, ¡ipython es increíble! Podría agregar un enlace: http://ipython.scipy.org/ – orip

+0

. A veces, ¿necesita separar la función en otra línea para llamar? p.ej. modelo.función? no funciona, pero f = modelo.función; ¿¿F?? funciona – thecheech

-3

Puede utilizar la palabra clave __doc__:

#print the class description 
print string.__doc__ 
#print function description 
print open.__doc__ 
+1

Esa es la descripción, no la definición. – Triptych

+0

para muchos builtins (como regla, funciones definidas en los módulos C), también incluye la firma de la función, pero no en general. – u0b34a0f6ae

+1

Mientras está en el shell interactivo, "help (object)" mostrará esto de una manera más navegable. –

8

Si bien generalmente estoy de acuerdo en que inspect es una buena respuesta, no estoy de acuerdo con que no se pueda obtener el código fuente de los objetos definidos en el intérprete. Si usa dill.source.getsource de dill, puede obtener la fuente de funciones y lambdas, incluso si se definen de forma interactiva. También puede obtener el código de métodos y funciones de clase enlazados o no definidos definidos en curries ... sin embargo, es posible que no pueda compilar ese código sin el código del objeto adjunto.

>>> from dill.source import getsource 
>>> 
>>> def add(x,y): 
... return x+y 
... 
>>> squared = lambda x:x**2 
>>> 
>>> print getsource(add) 
def add(x,y): 
    return x+y 

>>> print getsource(squared) 
squared = lambda x:x**2 

>>> 
>>> class Foo(object): 
... def bar(self, x): 
...  return x*x+x 
... 
>>> f = Foo() 
>>> 
>>> print getsource(f.bar) 
def bar(self, x): 
    return x*x+x 

>>> 
+0

a veces no funciona directamente con: ** getsource (my_function) **, pero luego podría hacer que funcione con ** getsource (my_function.func_code) ** – Afflatus

+0

o alternativamente: getsource (my_function .__ code__) – Afflatus

+0

hace no funciona en inactivo –

-3

Puede utilizar el __doc__ en la función, tomar hog() funcionan como ejemplo: Puede ver el uso de hog() así:

from skimage.feature import hog 

print hog.__doc__ 

La salida será:

Extract Histogram of Oriented Gradients (HOG) for a given image. 
Compute a Histogram of Oriented Gradients (HOG) by 

    1. (optional) global image normalisation 
    2. computing the gradient image in x and y 
    3. computing gradient histograms 
    4. normalising across blocks 
    5. flattening into a feature vector 

Parameters 
---------- 
image : (M, N) ndarray 
    Input image (greyscale). 
orientations : int 
    Number of orientation bins. 
pixels_per_cell : 2 tuple (int, int) 
    Size (in pixels) of a cell. 
cells_per_block : 2 tuple (int,int) 
    Number of cells in each block. 
visualise : bool, optional 
    Also return an image of the HOG. 
transform_sqrt : bool, optional 
    Apply power law compression to normalise the image before 
    processing. DO NOT use this if the image contains negative 
    values. Also see `notes` section below. 
feature_vector : bool, optional 
    Return the data as a feature vector by calling .ravel() on the result 
    just before returning. 
normalise : bool, deprecated 
    The parameter is deprecated. Use `transform_sqrt` for power law 
    compression. `normalise` has been deprecated. 

Returns 
------- 
newarr : ndarray 
    HOG for the image as a 1D (flattened) array. 
hog_image : ndarray (if visualise=True) 
    A visualisation of the HOG image. 

References 
---------- 
* http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients 

* Dalal, N and Triggs, B, Histograms of Oriented Gradients for 
    Human Detection, IEEE Computer Society Conference on Computer 
    Vision and Pattern Recognition 2005 San Diego, CA, USA 

Notes 
----- 
Power law compression, also known as Gamma correction, is used to reduce 
the effects of shadowing and illumination variations. The compression makes 
the dark regions lighter. When the kwarg `transform_sqrt` is set to 
``True``, the function computes the square root of each color channel 
and then applies the hog algorithm to the image. 
+0

La pregunta era sobre definición de función no función docstring. –

1

Esta es la forma en que descubrí cómo hacerlo:

import inspect as i 
    import sys 
    sys.stdout.write(inspect.getsource(MyFunction)) 

Esto lleva a cabo los caracteres de nueva línea y fuera imprime muy bien la función

Cuestiones relacionadas