Kann Python eine Funktionsdefinition drucken?

111

In JavaScript kann man die Definition einer Funktion ausdrucken. Gibt es eine Möglichkeit, dies in Python zu erreichen?

(Ich habe nur im interaktiven Modus herumgespielt und wollte ein Modul ohne open () lesen. Ich war nur neugierig).

Eddie Welker
quelle
Sie haben die Quelle für die Funktion. Was stimmt damit nicht?
S.Lott
1
Im interaktiven Modus können Sie mithilfe der Hilfe (Funktion) die Dokumentzeichenfolge für die Funktion anzeigen.
Mönch
Es gibt ein Duplikat dieser Frage: stackoverflow.com/questions/427453/…
Anderson Green

Antworten:

156

Wenn Sie die Funktion importieren, können Sie Folgendes verwenden 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)

Dies wird in der interaktiven Eingabeaufforderung arbeiten, aber anscheinend nur auf Objekte , die importiert werden (nicht in der interaktiven Eingabeaufforderung definiert Objekte). Und natürlich funktioniert es nur, wenn Python den Quellcode finden kann (also nicht für integrierte Objekte, C-Bibliotheken, .pyc-Dateien usw.).

Triptychon
quelle
Funktionen, die zur Laufzeit erstellt werden (einschließlich der interaktiven Eingabeaufforderung), haben auch keine Datei oder Leinennummer, was Sinn macht
John La Rooy
Das scheint das zu sein, wonach ich gesucht habe. Vielen Dank!
Eddie Welker
9
Was ist mit dem Drucken einer Funktionsdefinition, die ich zuvor im aktuellen interaktiven Python-Interpreter definiert habe? Ist das möglich?
GL2014
@ GL2014: Ja, siehe meine Antwort.
Mike McKerns
Ich kann bestätigen , dass diese Antwort und inspect.getsource () DOES Arbeit auf der interaktiven (ipython3) definiert funciton in Python 3.6.9 (Ubuntu).
Gnudiff
97

Wenn Sie iPython verwenden , können Sie Hilfe anfordernfunction_name? und function_name??die Quelle ausdrucken, wenn dies möglich ist.

Peter
quelle
2
Manchmal müssen Sie die Funktion in eine andere Leitung aufteilen, um sie aufzurufen? zB model.function ?? funktioniert nicht, aber f = model.function; f ?? Werke
Thecheech
12

So habe ich herausgefunden, wie es geht:

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

Dadurch werden die neuen Zeilenzeichen entfernt und die Funktion wird gut ausgedruckt

Steve
quelle
1
Ein gebrochenes Beispiel dort sollte es i.getsource (MyFunction) sein.
Svth
10

Obwohl ich im Allgemeinen zustimmen würde, dass dies inspecteine gute Antwort ist, würde ich nicht zustimmen, dass Sie den Quellcode der im Interpreter definierten Objekte nicht erhalten können. Wenn Sie dill.source.getsourcevon verwenden dill, können Sie die Quelle von Funktionen und Lambdas abrufen, auch wenn diese interaktiv definiert sind. Es kann auch den Code für gebundene oder ungebundene Klassenmethoden und -funktionen abrufen, die in Currys definiert sind. Möglicherweise können Sie diesen Code jedoch nicht ohne den Code des umschließenden Objekts kompilieren.

>>> 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
quelle
1
manchmal funktioniert es nicht direkt mit: getsource (my_function) , aber dann könnte ich es mit getource (my_function.func_code)
Afflatus
2

Verwenden Sie help(function)diese Option , um die Funktionsbeschreibung abzurufen.

Sie können mehr über lesen help() hier .

Safwan
quelle
1
Ich hatte die Quelle nicht in der Hilfe für mich definiert.
Ansuman
-6

Sie können das Schlüsselwort __doc__ verwenden:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Amirshk
quelle
1
Das ist die Beschreibung, nicht die Definition.
Triptychon
Für viele integrierte Funktionen (in der Regel Funktionen, die in C-Modulen definiert sind) enthält es auch die Funktionssignatur, jedoch nicht generell.
u0b34a0f6ae
1
In der interaktiven Shell zeigt "help (object)" dies auf eine besser navigierbare Weise an.
TK.
@kaizer Eine Funktionssignatur ist ebenfalls keine Definition. Was __doc__ tatsächlich zurückgegeben wird, ist der Autor des Codes, der in die Dokumentzeichenfolge (die dreifach in Anführungszeichen gesetzte Zeichenfolge) eingegeben wurde. Nicht mehr, nicht weniger.
Triptychon
Ich denke, die Definition ist hier nicht eindeutig. Für mich könnte es die Dokumentzeichenfolge oder den Code-Text oder beides oder sogar das Code-Objekt am Stück bedeuten
John La Rooy
-6

Sie können die __doc__in der Funktion verwenden, nehmen Sie die hog()Funktion als Beispiel: Sie können die Verwendung folgendermaßen sehen hog():

from skimage.feature import hog

print hog.__doc__

Die Ausgabe wird sein:

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
quelle
1
Die Frage betraf die Funktionsdefinition und nicht die Funktionsdokumentation.
Strg-Alt-Delor