Python peut-il imprimer une définition de fonction?

114

En JavaScript, on peut imprimer la définition d'une fonction. Existe-t-il un moyen d'accomplir cela en Python?

(Juste jouer en mode interactif, et je voulais lire un module sans open (). J'étais juste curieux).

Eddie Welker
la source
Vous avez la source de la fonction. Qu'est-ce qui ne va pas avec ça?
S.Lott
1
Et depuis le mode interactif, vous pouvez utiliser l'aide (fonction) pour afficher la docstring de la fonction.
monkut
Il y a un double de cette question: stackoverflow.com/questions/427453/…
Anderson Green

Réponses:

158

Si vous importez la fonction, vous pouvez utiliser 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)

Cela va travailler dans l'invite interactive, mais apparemment uniquement sur des objets importés ( les objets ne sont pas définis dans le message interactif). Et bien sûr, cela ne fonctionnera que si Python peut trouver le code source (donc pas sur les objets intégrés, les bibliothèques C, les fichiers .pyc, etc.)

Triptyque
la source
Les fonctions créées au moment de l'exécution (y compris l'invite interactive) n'ont pas non plus de fichier ou de numéro de ligne, ce qui a du sens
John La Rooy
Cela semble être ce que je recherchais. Merci!
Eddie Welker
9
Qu'en est-il de l'impression d'une définition de fonction que j'ai définie plus tôt dans l'interpréteur Python interactif actuel? Est-ce possible?
GL2014
@ GL2014: Oui, voyez ma réponse.
Mike McKerns
Je peux confirmer que cette réponse et inspect.getsource () NE FAIT travail sur la funciton définie interactive (ipython3) en Python 3.6.9 (Ubuntu).
Gnudiff
97

Si vous utilisez iPython , vous pouvez utiliser function_name?pour obtenir de l'aide et function_name??imprimer la source, si possible.

Peter
la source
2
parfois, vous devez séparer la fonction sur une autre ligne pour appeler? par exemple model.function ?? ne fonctionne pas mais f = model.function; F?? works
thecheech
12

Voici comment j'ai compris comment le faire:

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

Cela supprime les nouveaux caractères de ligne et imprime joliment la fonction

Steve
la source
1
Exemple cassé, il devrait s'agir de i.getsource (MyFunction).
svth
10

Bien que je convienne généralement que inspectc'est une bonne réponse, je ne suis pas d'accord pour dire que vous ne pouvez pas obtenir le code source des objets définis dans l'interpréteur. Si vous utilisez dill.source.getsourcefrom dill, vous pouvez obtenir la source des fonctions et des lambdas, même si elles sont définies de manière interactive. Il peut également obtenir le code des méthodes et fonctions de classe liées ou non liées définies dans les curry ... Cependant, vous ne pourrez peut-être pas compiler ce code sans le code de l'objet englobant.

>>> 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
la source
1
parfois cela ne fonctionne pas directement avec: getsource (ma_fonction) , mais alors je pourrais le faire fonctionner avec getsource (ma_fonction.func_code)
Afflatus
3

Utilisez help(function)pour obtenir la description de la fonction.

Vous pouvez en savoir plus help() ici .

Safwan
la source
1
n'a pas fait définir la source dans l'aide pour moi.
ansuman
-6

Vous pouvez utiliser le mot-clé __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Amirshk
la source
1
C'est la description, pas la définition.
Triptyque du
pour de nombreuses fonctions intégrées (en règle générale, les fonctions définies dans les modules C), il inclut également la signature de la fonction, mais pas en général.
u0b34a0f6ae
1
Dans le shell interactif, "help (object)" l'affichera d'une manière plus navigable.
TK.
@kaizer Une signature de fonction n'est pas non plus une définition. Quoi en __doc__ fait renvoie est ce que l'auteur du code a mis dans la chaîne doc (la chaîne entre guillemets triples). Ni plus ni moins.
Triptyque du
Je pense que la définition est ambiguë ici. Pour moi, cela pourrait signifier la docstring ou le texte de code ou les deux ou même l'objet de code à la fois
John La Rooy
-6

Vous pouvez utiliser le __doc__dans la fonction, prenez la hog()fonction comme exemple: Vous pouvez voir l'utilisation de hog()comme ceci:

from skimage.feature import hog

print hog.__doc__

La sortie sera:

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
la source
1
La question portait sur la définition de la fonction et non sur la fonction docstring.
ctrl-alt-delor