¿Puede Python imprimir una definición de función?

112

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

(Solo estaba jugando en modo interactivo y quería leer un módulo sin open (). Solo tenía curiosidad).

Eddie Welker
fuente
Tienes la fuente de la función. ¿Qué está mal con eso?
S.Lott
1
Y desde el modo interactivo puede usar la ayuda (función) para mostrar la cadena de documentos de la función.
monkut
Hay un duplicado de esta pregunta: stackoverflow.com/questions/427453/…
Anderson Green

Respuestas:

157

Si está importando la función, puede usar 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)

Esto va a trabajar 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, solo funcionará si Python puede encontrar el código fuente (por lo tanto, no en objetos integrados, bibliotecas C, archivos .pyc, etc.)

Tríptico
fuente
Las funciones que se crean en tiempo de ejecución (incluido el indicador interactivo) tampoco tienen un archivo o un número de línea, lo cual tiene sentido
John La Rooy
Eso parece ser lo que estaba buscando. ¡Gracias!
Eddie Welker
9
¿Qué hay de imprimir una definición de función que definí anteriormente en el intérprete interactivo de Python actual? es posible?
GL2014
@ GL2014: Sí, mira mi respuesta.
Mike McKerns
Puedo confirmar que esta respuesta y inspect.getsource () HACE trabajo sobre interactivo (ipython3) Funciton definido en Python 3.6.9 (Ubuntu).
Gnudiff
97

Si está usando iPython , puede usarfunction_name? para obtener ayuda e function_name??imprimirá la fuente, si es posible.

Pedro
fuente
2
¿A veces necesita separar la función en otra línea para llamar? ej. modelo.función ?? no funciona pero f = model.function; ¿¿F?? obras
thecheech
12

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

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

Esto elimina los caracteres de la nueva línea e imprime la función muy bien

Steve
fuente
1
Un ejemplo roto allí, debería ser i.getsource (MyFunction).
svth
10

Si bien generalmente estoy de acuerdo en que inspectes una buena respuesta, no estoy de acuerdo en que no pueda obtener el código fuente de los objetos definidos en el intérprete. Si usa dill.source.getsourcefrom 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 vinculados o no vinculados 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

>>> 
Mike McKerns
fuente
1
a veces no funciona directamente con: getsource (my_function) , pero luego podría hacerlo funcionar con getsource (my_function.func_code)
Afflatus
2

Utilizar help(function) para obtener la descripción de la función.

Puedes leer más sobre help() aquí .

Safwan
fuente
1
no tenía la fuente definida en la ayuda para mí.
ansuman
-6

Puede utilizar la palabra clave __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Amirshk
fuente
1
Esa es la descripción, no la definición.
Tríptico
para muchas incorporaciones (como regla, funciones definidas en módulos C), también incluye la firma de la función, pero no en general.
u0b34a0f6ae
1
Mientras que en el shell interactivo, "ayuda (objeto)" mostrará esto de una manera más navegable.
TK.
@kaizer La firma de una función tampoco es una definición. Lo que __doc__ realmente devuelve es lo que el autor del código puso en la cadena de documentos (la cadena entre comillas triples). Nada más y nada menos.
Tríptico
Creo que la definición es ambigua aquí. Para mí, podría significar la cadena de documentos o el texto del código o ambos o incluso el objeto de código en un tramo
John La Rooy
-6

Puede usar __doc__en la función, tome la hog()función como ejemplo: puede ver el uso de hog()esto:

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.
startag.cv
fuente
1
La pregunta era sobre la definición de la función, no sobre la cadena de documentos de la función.
ctrl-alt-delor