Python può stampare una definizione di funzione?


112

In JavaScript, si può stampare la definizione di una funzione. C'è un modo per farlo in Python?

(Stavo solo giocando in modalità interattiva e volevo leggere un modulo senza open (). Ero solo curioso).


Hai la fonte per la funzione. Cosa c'è che non va?
S.Lott

1
E dalla modalità interattiva puoi usare help (funzione) per visualizzare la docstring per la funzione.
monkut

C'è un duplicato di questa domanda: stackoverflow.com/questions/427453/…
Anderson Green

Risposte:


157

Se stai importando la funzione, puoi utilizzare 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)

Questo sarà lavorare nel prompt interattivo, ma a quanto pare solo su oggetti che vengono importati (non oggetti definiti all'interno del prompt interattivo). E ovviamente funzionerà solo se Python riesce a trovare il codice sorgente (quindi non su oggetti incorporati, librerie C, file .pyc, ecc.)


Le funzioni create in fase di esecuzione (incluso il prompt interattivo) non hanno nemmeno un file o un numero di lino, il che ha senso
John La Rooy

Sembra essere quello che stavo cercando. Grazie!
Eddie Welker,

9
Che dire della stampa di una definizione di funzione che ho definito in precedenza nell'attuale interprete interattivo Python? È possibile?
GL2014

@ GL2014: Sì, guarda la mia risposta.
Mike McKerns

Posso confermare che questa risposta e inspect.getsource () COMPORTA lavoro su interattivo (ipython3) funciton definito in Python 3.6.9 (Ubuntu).
Gnudiff

97

Se stai usando iPython , puoi usare function_name?per ottenere aiuto e function_name??stamperà il sorgente, se possibile.


2
a volte è necessario separare la funzione in un'altra riga da chiamare? es. model.function ?? non funziona ma f = model.function; f ?? funziona
thecheech

12

Questo è il modo in cui ho capito come farlo:

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

Questo rimuove i nuovi caratteri di riga e stampa bene la funzione


1
Esempio rotto lì, dovrebbe essere i.getsource (MyFunction).
svth

10

Anche se generalmente sono d'accordo che inspectè una buona risposta, non sono d'accordo sul fatto che non è possibile ottenere il codice sorgente degli oggetti definiti nell'interprete. Se usi dill.source.getsourcefrom dill, puoi ottenere l'origine di funzioni e lambda, anche se sono definiti in modo interattivo. Può anche ottenere il codice per dai metodi e dalle funzioni di classi associate o non associate definite in curry ... tuttavia, potresti non essere in grado di compilare quel codice senza il codice dell'oggetto che lo racchiude.

>>> 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

>>> 

1
a volte non funziona direttamente con: getsource (my_function) , ma poi potrei farlo funzionare con getsource (my_function.func_code)
Afflatus

2

Utilizzare help(function)per ottenere la descrizione della funzione.

Puoi leggere di più help() qui .


1
non aveva la fonte definita in aiuto per me.
ansuman

-6

Puoi utilizzare la parola chiave __doc__:

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

1
Questa è la descrizione, non la definizione.
Trittico

per molti builtin (di regola, funzioni definite nei moduli C), include anche la firma della funzione, ma non in generale.
u0b34a0f6ae

1
Mentre nella shell interattiva "help (oggetto)" lo mostrerà in un modo più navigabile.
TK.

@kaizer Una firma di funzione non è nemmeno una definizione. Ciò che __doc__ effettivamente restituisce è qualunque cosa l'autore del codice inserito nella doc string (la stringa tripla tra virgolette). Niente di più, niente di meno.
Trittico

Penso che la definizione sia ambigua qui. Per me potrebbe significare la docstring o il testo del codice o entrambi o anche l'oggetto codice in un tratto
John La Rooy

-6

Puoi usare __doc__nella funzione, prendi la hog()funzione come esempio: puoi vedere l'uso di hog()come questo:

from skimage.feature import hog

print hog.__doc__

L'output sarà:

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.

1
La domanda riguardava la definizione della funzione e non la docstring della funzione.
ctrl-alt-delor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.